使用用户定义的Spring @Components进行异步处理

时间:2017-09-07 17:59:12

标签: java spring multithreading asynchronous

我有三个主要类:Controller,Service1,Service2

Controller:简单的控制器,用于检索输入(列表)并将其传递给Service1

Service1:接收来自控制器procceses的输入并将其传递给Service2

Service2:从服务1接收已处理的输入并向外部服务发送POST请求

这三个都是用@Component注释的,根据我的阅读内容,默认情况下,Spring bean是单例,除非指定为每次使用bean时创建新实例的原型。值得注意的是,这些都是无国籍的。

主流程如下:

控制器 - >服务1 - >服务2。

它很简单并且同步运行良好。但我希望这三个类的异步,消防和遗忘行为。

我主要担心的是Service1可能是一个可能的瓶颈,因为它需要进行大量的处理(4-5秒)。我的意思是,当然,控制器可以产生很多CompleteableFutures,但由于Service1是一个单例,单个线程会锁定整个方法,直到它完成,这会导致某些同步行为。

我的问题是将范围设置为Service1的'prototype'来解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

  

因为Service1是一个单例,所以单个线程会锁定整个方法,直到它完成

不,一点也不。只有方法同步时才会出现这种情况。但由于该对象是无状态的,因此没有理由使其同步。几个线程同时执行给定对象的方法。这就是线程的重点。

请注意

  

每次使用bean时都会创建一个新实例的原型

也错了。每次向应用程序上下文请求bean时都会创建一个新实例。因此,如果你有两个控制器都使用原型bean Foo,bith将拥有自己的Foo实例。但是只有2个实例,由执行Foo方法的所有线程使用和共享。阅读the documentation,解释它。

如果您真的希望控制器在处理完成之前发回响应,请使用Async,如in the documentation所述。