Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用用户定义的Spring@Components进行异步处理_Java_Spring_Multithreading_Asynchronous - Fatal编程技术网

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

Java 使用用户定义的Spring@Components进行异步处理,java,spring,multithreading,asynchronous,Java,Spring,Multithreading,Asynchronous,我有三个主要类:Controller、Service1、Service2 控制器:检索输入(列表)并将其传递给Service1的简单控制器 服务1:从控制器进程接收输入并将其传递给服务2 Service2:从服务1接收处理后的输入,并向外部服务发送POST请求 这三个都是用@Component注释的,根据我所读的内容,Springbean在默认情况下是单例的,除非指定为prototype,它会在每次使用bean时创建一个新实例。需要注意的是,这些都是无状态的 主流程的工作原理如下: 控制器->服

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

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

服务1:从控制器进程接收输入并将其传递给服务2

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

这三个都是用@Component注释的,根据我所读的内容,Springbean在默认情况下是单例的,除非指定为prototype,它会在每次使用bean时创建一个新实例。需要注意的是,这些都是无状态的

主流程的工作原理如下:

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

它很简单,同步性很好。但我想要这三个类的异步、激发和遗忘行为

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

我的问题是,将Service1的范围设置为“原型”是否可以解决此问题

由于Service1是一个单线程,因此单线程将锁定整个方法,直到它完成

不,一点也不。只有同步了该方法,才会出现这种情况。但是没有理由让它同步,因为对象是无状态的。多个线程同时执行给定对象的方法。这就是线程的全部要点

注意

prototype,它在每次使用bean时创建一个新实例

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


如果您确实希望控制器在处理完成之前发回响应,请使用异步,如前所述。

只要服务是无状态的,就不会出现瓶颈,您可以让任意多的线程使用该实例。没有阻塞(除非你
synchronized
这个方法不是一件明智的事情)。如果您不关心控制器中的结果,只需在
Service1
@Async
中创建该方法并完成它即可。