0

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

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

有什么想法吗 ?

4

1 回答 1

0

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

尝试

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

@Scheduled 方法中的 Spring @Async 方法调用

,但我遇到了调度程序执行两次的新问题:

解决方案

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

所以我改变了

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

    private List<EnvironmentContextImpl> context;

至:

@Component
public class LumesseConnectorScheduler {

    @Autowired
    EnvironmentContextList environmentContextList;

感谢您的回答!

于 2018-02-07T10:32:46.853 回答