Sync Scheduled方法运行Async方法 - Spring @Scheduled,@ Async

时间:2018-02-06 10:42:57

标签: java spring spring-scheduled spring-async

我正在使用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

- >两次执行之间的时间只是一些非常低的时间......我只是不明白......

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

- > Async正在使用我的“尝试”:

  

<强>尝试

     

我尝试了类似这样的解决方法:

     

Spring @Async method call inside @Scheduled method

,但我有两个调度程序执行两次的新问题:

<强>解决方案

  

@ user27149尝试删除@ConfigurationProperties(prefix =“environment”)   或@Component

所以我改变了

@Component
@ConfigurationProperties(prefix="environment")
public class LumesseConnectorScheduler {

    private List<EnvironmentContextImpl> context;

要:

@Component
public class LumesseConnectorScheduler {

    @Autowired
    EnvironmentContextList environmentContextList;

感谢您的回答!