我正在使用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循环中的被调用方法需要异步运行。
尝试
我尝试了类似这样的解决方法:
Spring @Async method call inside @Scheduled method
- >把我的异步方法放在另一个类中。 像这样:
@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
- >两次执行之间的时间只是一些非常低的时间......我只是不明白......
有什么想法吗?
答案 0 :(得分:0)
- > Async正在使用我的“尝试”:
<强>尝试强>
我尝试了类似这样的解决方法:
,但我有两个调度程序执行两次的新问题:
<强>解决方案强>
@ user27149尝试删除@ConfigurationProperties(prefix =“environment”) 或@Component
所以我改变了
@Component
@ConfigurationProperties(prefix="environment")
public class LumesseConnectorScheduler {
private List<EnvironmentContextImpl> context;
要:
@Component
public class LumesseConnectorScheduler {
@Autowired
EnvironmentContextList environmentContextList;
感谢您的回答!