我正在分析一些jersey 2.0代码,并且对以下方法的工作方式有疑问:
@Stateless
@Path("/mycoolstuff")
public class MyEjbResource {
…
@GET
@Asynchronous //does this mean the method executes on child thread ?
public void longRunningOperation(@Suspended AsyncResponse ar) {
final String result = executeLongRunningOperation();
ar.resume(result);
}
private String executeLongRunningOperation() { … }
}
可以说在网络浏览器上输入即时消息,然后输入www.mysite / mycoolstuff,这将执行该方法,但是即时消息不了解asyncResponse既没有用于@Asynchronous批注,也没有使用。从浏览器中,我如何注意到它的异步性?删除注释有什么区别?另外阅读文档后的悬浮注释我不清楚其目的。
@Asynchronous批注只是告诉程序在新线程上执行此方法吗?这是执行“ new Thread(.....)”的便捷方法吗?
更新:此批注减轻了服务器挂在请求处理线程上的麻烦。吞吐量可以更好。无论如何从官方文档:
默认情况下,服务器上的请求处理在同步处理模式下工作,这意味着在单个I / O容器线程中处理请求的客户端连接。一旦处理完请求的线程返回到I / O容器,该容器就可以安全地假定请求处理已完成,并且可以安全地释放客户端连接,包括与该连接关联的所有资源。该模型通常足以处理处理资源方法执行花费相对较短时间的请求。但是,在已知执行资源方法要花费很长时间来计算结果的情况下,应使用服务器端异步处理模型。在此模型中,请求处理线程和客户端连接之间的关联被破坏。处理输入请求的I / O容器可能不再假定当请求处理线程返回时可以安全地关闭客户端连接。相反,需要公开显式挂起,恢复和关闭客户端连接的功能。请注意,使用服务器端异步处理模型不会改善客户端感知的请求处理时间。但是,通过将初始请求处理线程释放回I / O容器,而请求可能仍在队列中等待处理,或者处理仍在另一个专用线程上运行,这将增加服务器的吞吐量。释放的I / O容器线程可用于接受和处理新的传入请求连接。
如果您使用过@Suspended,则更为明确,否则使用它没有任何区别。让我们来谈谈它的好处。
下面是一些用于设置暂停/暂停超时的代码示例
public void longRunningOperation(@Suspended AsyncResponse ar) {
* ar.setTimeoutHandler(customHandler);
* ar.setTimeout(10, TimeUnit.SECONDS);
* final String result = executeLongRunningOperation();
* ar.resume(result);
* }
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句