java - spring中线程提交任务,不等待完成

标签 java spring multithreading

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

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

在返回响应之前我想做 -

executorService.execute(object);

这不应该是一个阻塞调用..

任何建议

最佳答案

Spring 异步方法是按照评论中建议的方式进行的。

一些注意事项:

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

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

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

关于java - spring中线程提交任务,不等待完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59834550/

相关文章:

C# : How do I get the actual item clicked from SelectedIndexChanged for a ListView control?

java - 使用 Java 的 Facebook OAuth 登录(仅限桌面)

java - 用小程序加载 .DLL 并在客户端上使用

java - 以编程方式调整大小后,半透明 JFrame 渲染效果不佳

java - JPedal getPageAsImage() 返回不完整的图像

java - 如何在查询中停止深度连接 hibernate?

delphi - 线程应用程序中的 Indy 错误!

c# - 为什么 Prism DelegateCommands 有时会导致线程异常?

java - Spring声明式事务模式下事务似乎不起作用

没有数据库的 Spring ShedLock