Servlet-3.0 API允许分离请求/响应上下文并在以后回复它.
但是,如果我尝试编写大量数据,例如:
AsyncContext ac = getWaitingContext() ;
ServletOutputStream out = ac.getResponse().getOutputStream();
out.print(some_big_data);
out.flush()
Run Code Online (Sandbox Code Playgroud)
对于Tomcat 7和Jetty 8,它实际上可能会阻塞 - 并且它确实阻塞了琐碎的测试用例.教程建议创建一个可以处理这种设置的线程池 - 这通常是对传统10K架构的反作用.
但是,如果我有10,000个打开的连接和一个让我们说10个线程的线程池,那么即使1%的具有低速连接或仅阻塞连接的客户端阻塞线程池并完全阻止彗星响应或减慢其速度也足够了显著.
预期的做法是获得"写就绪"通知或I/O完成通知,而不是继续推送数据.
如何使用Servlet-3.0 API完成,即如何获得:
如果Servlet-3.0 API不支持,那么是否有任何特定于Web Server的API(如Jetty Continuation或Tomcat CometEvent)允许真正异步处理此类事件而无需使用线程池伪造异步I/O.
有人知道吗?
如果这不可能,您可以参考文档确认吗?
我附上了模拟事件流的代码.
笔记:
ServletOutputStream该抛出IOException来检测断开连接的客户端keep-alive消息以确保客户端仍在那里在这样的例子中,我明确定义了大小为1的线程池来显示问题:
curl http://localhost:8080/path/to/app(两次)curd -d m=message http://localhost:8080/path/to/appcurd -d m=message http://localhost:8080/path/to/app我想在不使用线程池的情况下解决这样的问题,因为使用1000-5000个开放连接,我可以非常快地耗尽线程池.
下面的示例代码.
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import …Run Code Online (Sandbox Code Playgroud)