我的怀疑是关于异步JAX-RS的工作,这对我来说是一种新的东西,我正在努力抓住它的优势。我所理解的是,客户端发送一个请求,该请求从请求者线程委派到工作线程,一旦处理完成,响应就会使用AsyncResponse发送回客户端。我还理解的是,在整个过程中,客户端都在等待来自服务器的响应。(因此,对于客户端而言,它与正常的同步请求相同)
它还指出,当请求线程被发送到工作线程进行进一步处理时,因此通过这种方法,I/O线程可以自由地接受新的连接。
我不理解的是,客户端仍在等待响应,因此客户端和服务器之间仍保持活动连接。这不是在I/O线程中维护的吗?挂起在这里是什么意思?
而且,即使I/O线程由于进程委托给工作线程而被释放,与客户端的连接仍然在运行,那么服务器如何接受越来越多的连接呢?
我的下一个问题是关于这里使用的线程池。I/O线程和工作线程来自不同的池?工作线程/处理器线程是否不是来自服务器管理的池?
由于我不能理解这一点,我的下一个思考是,仅仅为I/O使用单独的池,并且在客户端连接仍在运行的情况下进行处理,这与使用内部处理阻止I/O是相同的,对吧?
我还没有很好地掌握这个概念。
发布于 2018-06-27 14:42:04
此场景中使用的线程池为:
可能有一个IO线程与该连接相关联,但这只是一个实现细节,不会对此产生影响。
当您使用AsyncResponse
时,只要您从handle方法返回,请求处理线程(来自池#1)就会被释放,容器可以使用它来处理另一个请求。
关于你的问题:
AsyncResponse
处理长时间运行的请求相比,它可以接受更多的连接,因为您正在释放有限的资源之一(线程池#1中的线程)。连接本身不会被释放,而且连接也是有限的资源,所以你可能会用完这些资源(以及可能受到CPU或memory).ExecutorService
或类似的方法,但重点是您自己管理“工作线程”。这里的例外是,如果你使用泽西的annotation.@ManagedAsync
,最后一个问题应该由我对#1的回答来回答-在较低的级别,仍然有一个资源与连接相关联,即使你使用的是AsyncResponse
,但AsyncResponse
确实释放了容器的请求处理线程,这可能在数量上比最大连接数量更有限。您可以选择通过更改服务器配置而不是使用AsyncResponse
来处理此问题,但是AsyncResponse
有两个优点-它在应用程序的控制之下,并且它是按请求而不是按服务器进行的。https://stackoverflow.com/questions/51055104
复制相似问题