我有一个CometProcessor实现,它有效地对潜在的大量客户端执行多播操作。当发生需要传播到所有客户端的事件时,CometProcessor将需要循环遍历写出响应的客户端列表。如果写入响应阻塞,则存在潜在的慢客户端可能会对事件的分布产生不利影响的可能性。示例:
public class MyCometProcessor implements CometProcessor {
private List<Event> connections = new ArrayList<Event>();
public void onEvent(byte[] someInfo) {
synchronized (connections) {
for (Event e : connections) {
HttpServletResponse r = e.getHttpResponse();
// -- Does this line block while waiting for I/O --
r.getOutputStream().write(someInfo);
}
}
}
public void event(CometEvent event) {
switch (event.getEventType()) {
case READ:
synchronzied (connections) {
connections.add(event);
}
break;
// ...
}
}
}更新:回答我自己的问题。来自CometProcessor的写入正在阻塞:
http://tomcat.apache.org/tomcat-6.0-doc/config/http.html
请参阅页面底部的表格。
发布于 2008-09-21 13:19:45
Tomcat6 6的HttpServlerResponse实现是响应类。在内部,它使用包装在CoyoteOutputStream上的OutputBuffer。顾名思义,这个类是一个缓冲区,默认大小为8k。所以,我想说的是,至少如果你的写作少于8k,那么你就不会阻止。您可能需要刷新您的客户来查看数据,这意味着它最终取决于您正在使用的连接器变体。在连接器配置中,如果需要非阻塞写入,则指定
protocol=org.apache.coyote.http11.Http11NioProtocol
此连接器/协议具有大规模可配置性:
http://tomcat.apache.org/tomcat-6.0-doc/config/http.html
https://stackoverflow.com/questions/109294
复制相似问题