Servlet 3.0 异步

2022-09-03 05:01:23

servlet 3.0 异步功能与以下特性之间的区别是什么:

Оld servlet implementation:

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

在servlet 3.0中,如果我浪费一个线程来做重处理 - 我在容器中多赚了一个线程,但我在重处理中浪费了它...... :(

有人可以帮忙吗?


答案 1

这是行不通的。方法完成后,响应完成并发送回客户端。您的话题可能仍在运行,也可能不仍在运行,但它无法再更改响应。doGet

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

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

重要的是,一旦通过调用开始异步处理,就可以自由地做其他事情。例如,它可以接受新的请求。这提高了吞吐量。RequestThreadstartAsync(...)


答案 2

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

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


推荐