首页 > 解决方案 > 线程提交任务,不等待春天完成

问题描述

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

在发回响应之前并行,我想执行/提交一个应该在后台运行的任务,我的调用不应该依赖于这个任务的成功或失败。

在返回回复之前,我想做的 -

executorService.execute(object);

这不应该是阻塞调用..

任何建议

标签: javaspringmultithreading

解决方案


正如评论中所建议的那样,Spring Async 方法是这里的方法。

一些警告:

  1. 异步方法可以有不同的返回类型,它们确实可以返回 CompletableFuture 但这是以防万一,如果您从某个后台进程调用它们并希望等待/检查它们的执行状态,或者可能在未来准备好时执行其他操作. 在您的情况下,您似乎想要“即发即弃”的行为。因此,您应该为带注释的方法使用void返回类型。@Async

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

  3. 考虑自定义任务执行器,以确保您使用符合您需求的执行器运行异步方法。例如,您可能不希望每次调用 async 方法都会产生一个新线程(并且有一个行为类似这样的执行程序)。例如,您可以在此处阅读有关各种执行者的信息

更新

在代码方面,您应该执行以下操作:

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;
  }
}

推荐阅读