Я использую аннотацию @Scheduled и @Async для Spring.
Моя цель
Чтобы запланировать метод синхронизации, который запускает цикл for, а этот цикл запускает асинхронный метод, поэтому следующему значению в цикле не нужно ждать завершения метода.
Посмотрите мой код ниже:
/**
* Explanation: Scheduling async task for getting new hired candidates from the Lumesse Queue and saving the received data.
*/
@LoggableDebug
@Scheduled(fixedRateString = "${scheduler.insertCandidateFromQueueInDB.fixedRate}")
public void insertNewHiredCandidateFromQueueInDbScheduler() {
for(EnvironmentContext environmentContext: context) {
if(environmentContext.isActive()) {
environmentAsyncHandlerInsertNewHiredCandidateFromQueueInDb(environmentContext);
}
}
}
/**
* @param environmentContext
* Explanation: Async task for getting new hired candidates from the Lumesse Queue and saving the received data.
*/
@LoggableDebug
@Async
public void environmentAsyncHandlerInsertNewHiredCandidateFromQueueInDb(EnvironmentContext environmentContext) {
CandidateLumesse candidateLumesse;
candidateLumesse = lumesseConnectorService.getNewHiredCandidateDataFromQueue(environmentContext);
}
Проблема:
Мой асинхронный метод не работает с разными задачами. Это работает только тогда, когда я помещаю аннотацию @Async также в свой запланированный метод. Но тогда мой запланированный метод будет работать асинхронно, а это не то, чего я хочу. Запланированный метод должен выполняться синхронно, но вызываемый метод в цикле for должен выполняться асинхронно.
Попытки
Я пробовал обходной путь, подобный этому:
Вызов метода Spring @Async внутри метода @Scheduled
-> помещая мои асинхронные методы в другой класс. Так:
@LoggableDebug
@Scheduled(fixedRateString = "${scheduler.insertCandidateFromQueueInDB.fixedRate}")
public void insertNewHiredCandidateFromQueueInDbScheduler() {
for(EnvironmentContext environmentContext: context) {
if(environmentContext.isActive()) {
asyncServiceExecutor.environmentAsyncHandlerInsertNewHiredCandidateFromQueueInDb(environmentContext);
}
}
}
проблема в том, что моя запланированная задача выполняется дважды...
Обновить
Я сделал еще несколько журналов, и мой объект создается только один раз:
2018-02-06 13:17:19.053 WARN 13144 --- [ main]
c.d.l.c.s.LumesseConnectorScheduler : #### SCHEDULER CLASS CONSTRUCTOR
Моя fixedRate 3000 -> 3 секунды. Кто-то запросил «увеличить его до 30 секунд, чтобы увидеть поток», но все же он выполняется дважды: поэтому через 3 или 30 секунд или независимо от того, на что была установлена фиксированная скорость, он выполнит его дважды вместо одного раза..
2018-02-06 13:17:26.388 WARN 13144 --- [pool-7-thread-1]
c.d.l.c.s.LumesseConnectorScheduler : #### START SCHEDULING
2018-02-06 13:17:26.397 WARN 13144 --- [pool-7-thread-1]
c.d.l.c.s.LumesseConnectorScheduler : #### START SCHEDULING
-> Время между двумя выполнениями составляет всего несколько очень малых миллисекунд. Я просто не понимаю..
Есть предположения ?
ContextLoaderListener
, так и дляDispatcherServlet
. Сканирование и настройка одних и тех же компонентов и, таким образом, загрузка приложения дважды, что приводит к двойному планированию. - person M. Deinum   schedule 06.02.2018@ConfigurationProperties(prefix="environment")
или@Component
- person xingbin   schedule 06.02.2018