Весенняя загрузка @Scheduler не работает на Tomcat - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть метод @Scheduled, который запускается без проблем при сборке приложения Spring Boot с использованием встроенного tomcat.Но когда я строю свой проект в .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()));
  }
}

1 Ответ

0 голосов
/ 30 мая 2019

У меня была та же проблема: все работало нормально на встроенном сервере 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);
        }
    }
    

    Полагаю, наиболее важными являются аннотации @EnableScheduling и @EnableAsync (у меня не было 2-го ранее)

  2. Последнеено не в последнюю очередь, я заметил, что мой основной класс приложений не расширялся SpringBootServletInitializer, поэтому я тоже исправил это:

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

    Без него приложение запустилось, но @Scheduling не работало ..или я исправил это раньше и забыл :-) В любом случае, пожалуйста, убедитесь, что он у вас есть!; -)

Теперь все работает на производстве как положено.

...