线程提交任务,不必等待春季完成

时间:2020-01-21 05:15:05

标签: java spring multithreading

我正在编写一个服务,在该服务中我想公开一个将调用另一个服务的终结点,如果该服务调用成功,那么我要将结果发送回UI /调用应用程序。

在发送回响应之前,我想并行执行/提交一个应在后台运行的任务,而我的调用不应取决于此任务的成功或失败。

在返回响应之前,我想做的-

executorService.execute(object);

这不应该是阻止呼叫。

任何建议

1 个答案:

答案 0 :(得分:0)

Spring Async方法是注释中建议的方法。

一些警告:

  1. 异步方法可以具有不同的返回类型,确实可以返回CompletableFuture,但这是万一您从某个后台进程中调用它们并且想等待/检查其执行状态,或者执行某些操作的情况否则,当未来做好准备时。在您的情况下,您似乎想要“一劳永逸”的行为。因此,您应该为void带注释的方法使用@Async返回类型。

  2. 确保放置@EnableAsync。在这种情况下,它的工作方式是用某种代理来包装具有@Async方法的bean,因此代理实际上已注入到您的服务中。因此@EnableAsync启用了此代理生成机制。您可以在调试器中验证这种情况,并检查注入的引用对象的实际类型。

  3. 请考虑自定义任务执行程序,以确保您正在使用符合您需求的执行程序运行异步方法。例如,您可能不希望每次异步方法调用都会产生一个新线程(并且有一个执行者的行为类似于此)。例如,您可以阅读各种执行器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;
  }
}