我有一个 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
请参阅页面底部的表格。