我有一个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
请参阅页面底部的表格。
答案 0 :(得分:1)
Tomcat6的HttpServlerResponse实现是Response类。在内部,它使用围绕OutputBuffer的CoyoteOutputStream。顾名思义,这个类是一个缓冲区,默认大小为8k。所以我要说的是,如果你写的不到8k,那么你就不会阻止。您可能需要为客户端刷新以查看数据,这意味着最终它取决于您使用的连接器变体。如果您想要非阻塞写入,请在Connector配置中指定
protocol=org.apache.coyote.http11.Http11NioProtocol
此连接器/协议可以大规模配置: