Spring boot @Scheduler 不适用于 tomcat

Fly*_*tle 4 java quartz-scheduler tomcat8 spring-boot

我有一个 @Scheduled 方法,当我使用嵌入式 tomcat 构建 Spring Boot 应用程序时,该方法运行没有问题。但是当我在 .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()));
  }
}
Run Code Online (Sandbox Code Playgroud)

ADi*_*3ek 5

我遇到了同样的问题:内置 tomcat 服务器上一切正常,但当我将 .war 文件部署到生产中时却不行。我尝试了一些方法来解决这个问题(不记得具体是哪一种有效),最终我得到了以下结果:

  1. 我有专用的调度程序配置类:

    @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);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    我想,上面最重要的是@EnableScheduling@EnableAsync注释(我之前没有第二个)

  2. 最后但并非最不重要的一点是,我注意到我的主应用程序类没有扩展,SpringBootServletInitializer所以我也修复了这个问题:

    public class SpringBootApplication extends SpringBootServletInitializer {
        public static void main(String[] args) {
            SpringApplication.run(MarketplaceMonitorApplication.class, args);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    如果没有它,应用程序会启动但@Scheduling无法工作..或者我之前修复了该问题并忘记了:-)无论如何,请确保您拥有它!;-)

现在生产中一切都按预期进行。