Servlet 3.0异步

时间:2010-09-28 07:12:41

标签: java servlets java-ee-6

servlet 3.0异步功能与

之间的区别是什么?
old servlet impl
doGet(request,response) {
Thread t = new Thread(new Runnable()
     void run(){
        // heavy processing
        response.write(result)
     }
}
t.start();

在servlet 3.0中如果我浪费一个线程来进行繁重的处理 - 我在容器中又多了一个线程,但是我把它浪费在繁重的处理中...... :(

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:23)

这不起作用。一旦您的doGet方法结束,响应就会完成并发送回客户端。您的线程可能正在运行,也可能尚未运行,但它不能再更改响应。

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

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

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

答案 1 :(得分:2)

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

最诚挚的问候, 凯沙夫

答案 2 :(得分:2)

有几个API支持COMET(长期存在的HTTP请求,其中没有线程/请求问题)编程。因此,没有严格的需要使用servlet 3 API来避免线程/请求。一个是在{Glassfish 2.11(Grizzly)中运行的example引擎。第二个解决方案是Jetty Continuation。第三个是Servlet 3 API.

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

答案 3 :(得分:2)

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