spring Sping Boot 报告@Async方法的执行状态

jhkqcmku  于 2023-08-02  发布在  Spring
关注(0)|答案(1)|浏览(130)

我在一个spring-boot项目中工作,我有一个长时间运行的任务,我在@Async方法中触发。

public void globalCall(){

  serviceOne.doSomething();
  serviceTwo.doSomething();
  serviceThree.doSomething();

}

字符串
下面是我的async调用:

@Async
public void longProcess(){
    //persist the status in the DB , i have a GET API to get the value from DB
   reportService.report("STARTED");

   // Trigger my long process 
   globalService.globalCall();
}


我的问题是,我不知道在什么时候我必须调用reportService.report("PROCESSING");时,我的longProcess()仍然在运行...?当我的longProcess()完成时,我必须调用reportService.report("FINISHED");的情况相同。你有什么办法调整我的代码来捕捉这些事件吗?
问候。

k2fxgqgv

k2fxgqgv1#

我会修改你的longProcess并使其同步,但使对globalCall的调用成为异步的部分。另外,我会让它返回一个CompletableFuture,我可以从我调用它的地方监视它。

public void longProcess(){
    CompletableFuture<Boolean> completableFuture = new CompletableFuture<>();
    reportService.report("STARTED");

    Executors.newCachedThreadPool().submit(() -> {
        completableFuture.completeAsync(() -> {
            reportService.report("PROCESSING");

            // Trigger my long process 
            globalService.globalCall();

            reportService.report("FINISHED");

            // mark the future as finished
            return completableFuture.complete(true);
        });
    });
}

字符串
你可以像以前那样调用它,但是你会得到一个CompletableFuture,如果你想的话,你可以查询它,但是你必须在另一个线程中这样做,否则你会阻塞。
你的电话看起来像这样,和你的电话一样。我在最后一次调用中添加了一种监视未来的方法,以便给予您了解如何监视它。如果你这样做,你会希望在它自己的线程中运行这个块,否则,你会阻塞。

public void globalCall(){
  seerviceOne.doSomething();
  serviceTwo.doSomething();

  CompletableFuture serviceThreeFuture = serviceThree.doSomething();
  // check the future every second to see if it's done, 
  while (!serviceThreeFuture.isDone()) {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }

    reportService.report("STILL RUNNING");
  }
}


我还建议您创建一个ExecutorService bean并自动连接它,这样就不必总是调用Executors.newCachedThreadPool()

@Bean
public ExecutorService threadPoolExecutor() {
    return Executors.newCachedThreadPool();
}


使用自动接线ExecutorService代替Executors.newCachedThreadPool()

...
@Autowired private ExcutorService executorService;

executorService.submit(() -> {
...

相关问题