我在一个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");
的情况相同。你有什么办法调整我的代码来捕捉这些事件吗?
问候。
1条答案
按热度按时间k2fxgqgv1#
我会修改你的longProcess并使其同步,但使对
globalCall
的调用成为异步的部分。另外,我会让它返回一个CompletableFuture,我可以从我调用它的地方监视它。字符串
你可以像以前那样调用它,但是你会得到一个
CompletableFuture
,如果你想的话,你可以查询它,但是你必须在另一个线程中这样做,否则你会阻塞。你的电话看起来像这样,和你的电话一样。我在最后一次调用中添加了一种监视未来的方法,以便给予您了解如何监视它。如果你这样做,你会希望在它自己的线程中运行这个块,否则,你会阻塞。
型
我还建议您创建一个ExecutorService bean并自动连接它,这样就不必总是调用
Executors.newCachedThreadPool()
。型
使用自动接线
ExecutorService
代替Executors.newCachedThreadPool()
型