我正在使用 Spring 的 @Scheduled 和 @Async 注释。
我的目的
调度一个同步方法——它运行一个 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 注释也放在我的计划方法上时才有效。但是然后我的预定方法将运行 asyncronuos ,这不是我想要的。调度的方法需要同步运行,而for循环中被调用的方法需要异步运行。
尝试
我尝试了这样的解决方法:
@Scheduled 方法中的 Spring @Async 方法调用
-> 将我的异步方法放在另一个类中。像这样:
@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 seconds 有人要求“将其增加到 30 sec 以查看流程”,但它仍然执行两次:因此在 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
-> 两次执行之间的时间只是一些非常低的毫秒..我只是不明白..
有什么想法吗 ?