我正在编写一个服务,我想公开一个端点来调用另一个服务,如果服务调用成功,那么我想将结果发送回 UI/调用应用程序。
在发回响应之前,我想并行执行/提交一个应在后台运行的任务,并且我的调用不应依赖于该任务的成功或失败。
在返回响应之前我想做 -
executorService.execute(object);
这不应该是一个阻塞调用..
任何建议
最佳答案
Spring 异步方法是按照评论中建议的方式进行的。
一些注意事项:
异步方法可以有不同的返回类型,它们确实可以返回 CompletableFuture,但这是在您从某个后台进程调用它们并且想要等待/检查它们的执行状态或者执行某些操作的情况下否则当 future 准备好时。就您而言,您似乎想要“一劳永逸”的行为。因此,您应该为
@Async
带注释的方法使用void
返回类型。确保放置
@EnableAsync
。在这个引擎盖下,它的工作方式是用某种代理包装具有@Async方法的bean,因此代理实际上被注入(inject)到您的服务中。因此@EnableAsync开启了这个代理生成机制。您可以在调试器中验证通常是这种情况,并检查注入(inject)的引用对象的实际类型。考虑自定义任务执行器,以确保您使用符合您需求的执行器运行异步方法。例如,您可能不希望每次调用异步方法都会生成一个新线程(并且有一个执行器的行为如下)。您可以阅读有关各种执行器的信息 here例如
更新
就代码而言,你应该这样做:
public class MyAsyncHandler {
@Async
public void doAsyncJob(...) {
...
}
}
@Service
public class MyService {
@Autowired // or autowired constructor
private MyAsyncHandler asyncHandler;
public Result doMyMainJob(params) {
dao.saveInDB();
// do other synchronous stuff
Result res = prepareResult();
asyncHandler.doAsyncJob(); // this returns immediately
return res;
}
}
关于java - spring中线程提交任务,不等待完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59834550/