Spring 启动 @Scheduler 在 tomcat 上不工作
Spring boot @Scheduler not working on tomcat
我有一个 @Scheduled 方法,当我使用嵌入式 tomcat 构建我的 Spring 引导应用程序时,它可以毫无问题地运行。但是当我在 .war 中构建我的项目并使用 tomcat v8 部署它时,似乎调度程序没有触发。其他功能很好,只是这个调度程序不会在我的服务器上触发。
@Component
public class DeleteUser {
@Autowired
private UserService userService;
@Autowired
private UserAuthoritiesService userAuthService;
private static final Logger logger = LoggerFactory.getLogger(DeleteUser.class);
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
//(cron="second, minute, hour, day of month, month, day(s) of week")
@Scheduled(cron="0 0 8 * * *", zone="Asia/Kuala_Lumpur")
public void schedulerDeleteUser() {
List<User> ls = userService.getAllInactiveUser3Day(new Date());
try {
if(ls.size()>0) {
for(User user: ls) {
userService.updateStatusAccount(false, user.getId());
}
}
}
catch(Exception e) {
logger.error(e.getMessage());
}
logger.info("Scheduler run at {}", dateFormat.format(new Date()));
}
}
我遇到了同样的问题:在 built-in tomcat 服务器上一切正常,但不是
当我将 .war 文件部署到生产环境中时。我已经尝试了一些方法来解决它(不记得到底是哪一个起作用了),最终我得到了以下结果:
我有专门的调度程序配置class:
@Configuration
@EnableScheduling
@EnableAsync
public class SchedulerConfiguration implements SchedulingConfigurer {
private final int POOL_SIZE = 2;
private final String THREAD_NAME_PREFIX = "task-scheduler-";
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(POOL_SIZE);
threadPoolTaskScheduler.setThreadNamePrefix(THREAD_NAME_PREFIX);
threadPoolTaskScheduler.initialize();
scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
}
}
我猜,上面最重要的是@EnableScheduling
和@EnableAsync
注释(我之前没有第二个)
最后但同样重要的是,我注意到我的主应用程序 class 没有扩展 SpringBootServletInitializer
所以我也修复了它:
public class SpringBootApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(MarketplaceMonitorApplication.class, args);
}
}
没有它,应用程序启动了,但 @Scheduling
没有工作.. 或者我早些时候修复了它而忘记了:-)无论如何,请确保你有它! ;-)
现在制作中的一切都按预期进行了。
我有一个 @Scheduled 方法,当我使用嵌入式 tomcat 构建我的 Spring 引导应用程序时,它可以毫无问题地运行。但是当我在 .war 中构建我的项目并使用 tomcat v8 部署它时,似乎调度程序没有触发。其他功能很好,只是这个调度程序不会在我的服务器上触发。
@Component
public class DeleteUser {
@Autowired
private UserService userService;
@Autowired
private UserAuthoritiesService userAuthService;
private static final Logger logger = LoggerFactory.getLogger(DeleteUser.class);
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
//(cron="second, minute, hour, day of month, month, day(s) of week")
@Scheduled(cron="0 0 8 * * *", zone="Asia/Kuala_Lumpur")
public void schedulerDeleteUser() {
List<User> ls = userService.getAllInactiveUser3Day(new Date());
try {
if(ls.size()>0) {
for(User user: ls) {
userService.updateStatusAccount(false, user.getId());
}
}
}
catch(Exception e) {
logger.error(e.getMessage());
}
logger.info("Scheduler run at {}", dateFormat.format(new Date()));
}
}
我遇到了同样的问题:在 built-in tomcat 服务器上一切正常,但不是 当我将 .war 文件部署到生产环境中时。我已经尝试了一些方法来解决它(不记得到底是哪一个起作用了),最终我得到了以下结果:
我有专门的调度程序配置class:
@Configuration @EnableScheduling @EnableAsync public class SchedulerConfiguration implements SchedulingConfigurer { private final int POOL_SIZE = 2; private final String THREAD_NAME_PREFIX = "task-scheduler-"; @Override public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); threadPoolTaskScheduler.setPoolSize(POOL_SIZE); threadPoolTaskScheduler.setThreadNamePrefix(THREAD_NAME_PREFIX); threadPoolTaskScheduler.initialize(); scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler); } }
我猜,上面最重要的是
@EnableScheduling
和@EnableAsync
注释(我之前没有第二个)最后但同样重要的是,我注意到我的主应用程序 class 没有扩展
SpringBootServletInitializer
所以我也修复了它:public class SpringBootApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(MarketplaceMonitorApplication.class, args); } }
没有它,应用程序启动了,但
@Scheduling
没有工作.. 或者我早些时候修复了它而忘记了:-)无论如何,请确保你有它! ;-)
现在制作中的一切都按预期进行了。