我正在编写一个服务,在该服务中我想公开一个将调用另一个服务的终结点,如果该服务调用成功,那么我要将结果发送回UI /调用应用程序。
在发送回响应之前,我想并行执行/提交一个应在后台运行的任务,而我的调用不应取决于此任务的成功或失败。
在返回响应之前,我想做的-
executorService.execute(object);
这不应该是阻止呼叫。
任何建议
答案 0 :(得分:0)
Spring Async方法是注释中建议的方法。
一些警告:
异步方法可以具有不同的返回类型,确实可以返回CompletableFuture,但这是万一您从某个后台进程中调用它们并且想等待/检查其执行状态,或者执行某些操作的情况否则,当未来做好准备时。在您的情况下,您似乎想要“一劳永逸”的行为。因此,您应该为void
带注释的方法使用@Async
返回类型。
确保放置@EnableAsync
。在这种情况下,它的工作方式是用某种代理来包装具有@Async
方法的bean,因此代理实际上已注入到您的服务中。因此@EnableAsync
启用了此代理生成机制。您可以在调试器中验证这种情况,并检查注入的引用对象的实际类型。
请考虑自定义任务执行程序,以确保您正在使用符合您需求的执行程序运行异步方法。例如,您可能不希望每次异步方法调用都会产生一个新线程(并且有一个执行者的行为类似于此)。例如,您可以阅读各种执行器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;
}
}