Servlet 3.0异步

servlet 3.0异步function之间的区别是什么:

old servlet impl doGet(request,response) { Thread t = new Thread(new Runnable() void run(){ // heavy processing response.write(result) } } t.start(); 

在servlet 3.0中,如果我浪费一个线程来进行繁重的处理 – 我在容器中再赚一个线程,但我在繁重的处理中浪费它… 🙁

有人可以帮忙吗?

这不行。 doGet方法结束后,响应完成并发送回客户端。 您的线程可能仍在运行,但可能不再运行,但它不能再更改响应。

Servlet 3.0中新的异步function的作用是,它允许您释放请求线程以处理另一个请求。 会发生什么是以下情况:

 RequestThread: |-- doGet() { startAsync() } // Thread free to do something else WorkerThread: |-- do heavy processing --| OtherThread: |-- send response --| 

重要的是,一旦RequestThread通过调用startAsync(...)启动异步处理,它就可以自由地执行其他操作。 例如,它可以接受新请求。 这提高了吞吐量。

有几个API支持COMET (长生活HTTP请求,没有线程/请求问题)编程。 因此,没有必要使用servlet 3 API来避免线程/请求。 一个是在Glassfish 2.11( 示例 )中运行的Grizzly引擎。 第二个解决方案是Jetty Continuation 。 第三个是Servlet 3 API。 。

基本概念是请求创建一些容器管理的异步处理程序,其中请求可以订阅由对象标识的事件(例如clientid字符串)。 然后,异步处理线程可以向处理程序说明事件发生,并且请求获得一个线程继续。 这完全取决于您可以使用的API选择的应用程序服务器。 你选择哪个?

servlet 3.0异步function提供了保持http连接打开,但是当请求无法立即提供但等待某些事件发生时,或者例如当您编写一些comet / reverse ajax应用程序时,释放任何未使用的线程。在上面的情况下,你正在完全创建一个新线程,所以它不应该对你有任何影响,除非你想让请求等待某个事件。

最诚挚的问候,凯沙夫

在servlet容器中创建自己的线程是一件麻烦事。 (可能存在必须执行此操作的情况,但如果您有一些管理线程的框架,那么您应该使用它。)