2015-08-30 5 views
0

Я использую аннотацию @Scheduled для запуска задания cron. Планирование работает некоторое время, а затем перестает работать. дам упрощенных фрагменты моего кода:Весна 4 @ Планируемые остановки работы

Это планировщик:

//org.springframework.scheduling.annotation.Scheduled 
@Scheduled("*/30 * * * * *")  
public void performTask() { 
    logger.info("Starting agent"); 
    getAgentAsyncTask().execute(); 
    logger.info("Ending agent"); 
} 

Это задача, которая выполняется с помощью планировщика

//org.springframework.scheduling.annotation.Async 
@Async(TASK_EXECUTOR) 
@Override 
public void execute() { 
    logger.info("Starting task"); 
    //send some rest requests 
    logger.info("Ending task"); 
} 

Оба: «Запуск агента» и " Конечный агент "регистрируются равным числом раз. Таким образом, каждое планирование заканчивается должным образом.

Оба: «Начальная задача» и «Конечная задача» регистрируются равным числом раз. Итак, определенно, «задача» не блокирует вещи.

Но через некоторое время он прекращает вести учет. Что может быть проблемой?

Здесь TASK_EXECUTOR является следующая боба:

@Bean(TASK_EXECUTOR) 
public ThreadPoolTaskExecutor createDefaultTaskExecutor() { 
      ThreadPoolTaskExecutor te = new ThreadPoolTaskExecutor(); 
      te.setMaxPoolSize(15); 
      te.setCorePoolSize(15); 
      te.initialize(); 
      return te; 
    } 

Спринг версия:

4.1.6.RELEASE

+0

Вы используете это внутри или снаружи контейнера? Кроме того, какая версия Java? – Brad

+0

Внутри контейнера (конфигурация, основанная на аннотациях, у меня есть @EnableScheduling @EnableAsync). Java-версия 8 – coolscitist

+4

вы читали? http://stackoverflow.com/q/17909404/206466 – xenoterracide

ответ

7

Такая ситуация может быть вызвана бесконечной петли в тело запланированного метода или если есть вызов внешней системы, и контроллер ждет синхронно, чтобы получить ответ без какого-либо таймаута.

Попробуйте использовать этот простой фрагмент кода. Метод будет запущен только один раз и не будет запущен через указанный интервал в 5 секунд.

@Scheduled(fixedRate = 5000) 
public void printPeriodically() { 
    System.out.println("This is my periodic method"); 
    while(true) {}; 
} 
0

посмотреть, будет ли повесить работу или нет. если это произойдет .. задача не будет выполняться через некоторое время, я имею в виду после достижения максимального размера пула. проверьте код реализации, освобождены ли потоки после успешного выполнения.