2008-09-20 34 views
0

我有一個CometProcessor實現,它可以有效地對可能是大量的客戶端進行多播。當發生需要傳播給所有客戶端的事件時,CometProcessor將需要循環遍歷客戶端列表寫出響應。如果寫作響應被阻止,那麼潛在的慢客戶可能會對事件的分佈產生不利影響。例如:是從一個Tomcat 6 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

見表格在頁面的底部。

回答

1

Tomcat6的HttpServlerResponse實現是Response類。它在內部使用一個圍繞OutputBuffer的CoyoteOutputStream。顧名思義,這個類是一個緩衝區,默認大小爲8k。所以我至少要說,如果你寫的不到8k,那麼你不會阻止。您可能需要刷新以便客戶端查看數據,這意味着最終取決於您使用的連接器類型。在您的連接器配置,如果你想非阻塞寫然後指定

protocol=org.apache.coyote.http11.Http11NioProtocol

此接口/協議是大量配置:

http://tomcat.apache.org/tomcat-6.0-doc/config/http.html