2015-04-02 49 views
0

我們已經實施的解決方案Java Socket技術選擇犯規開關寫狀態

@Override 
public void run() { 
    super.run(); 
    while (session.isConnectionAlive()) { 
     try { 
      // Wait for an event 
      selector.select(); 
     } catch (IOException e) { 
      log.error("Selector error: {}", e.toString()); 
      log.debug("Stacktrace: ", e); 
      session.closeConnection(); 
      break; 
     } 
     handleSelectorkeys(selector.selectedKeys()); 
    } 
    executorService.shutdown(); 
    log.debug("Ucp worker stopped"); 
} 

private void handleSelectorkeys(Set<SelectionKey> selectedKeys) { 
    Iterator<SelectionKey> keys = selector.selectedKeys().iterator(); 
    while (keys.hasNext()) { 
     SelectionKey selKey = keys.next(); 
     selector.selectedKeys().remove(selKey); 
     try { 
      processSelectionKey(selKey); 
     } catch (IOException e) { 
      // Handle error with channel and unregister 
      selKey.cancel(); 
      log.error("Selector error: {}", e.toString()); 
      log.debug("Stacktrace: ", e); 
     } 
    } 
} 

public void processSelectionKey(SelectionKey selKey) throws IOException { 

    // Since the ready operations are cumulative, 
    // need to check readiness for each operation 
    if (selKey.isValid() && selKey.isConnectable()) { 
     log.debug("connectable"); 
     // Get channel with connection request 
     SocketChannel sChannel = (SocketChannel) selKey.channel(); 

     boolean success = sChannel.finishConnect(); 
     if (!success) { 
      // An error occurred; handle it 
      log.error("Error on finish"); 
      // Unregister the channel with this selector 
      selKey.cancel(); 
     } 
    } 

    if (selKey.isValid() && selKey.isReadable()) { 
     readMessage(selKey); 
    } 

    if (selKey.isValid() && selKey.isWritable()) { 
     writeMessage(selKey); 
    } 

    if (selKey.isValid() && selKey.isAcceptable()) { 
    } 

} 

它,直到我們開始發送每秒大約100個郵件工作正常,還會收到100響應和100收到消息併發送100條我們的回覆(雙向每秒約400條消息)由於未知問題導致我們的合作伙伴切斷連接,因此時常會出現此類負載。我們重新建立連接,但由於某種原因,選擇器不會切換到只寫狀態讀取。我們收到很多消息,但無法發送任何內容。
任何想法?我們這邊是否有操作系統問題?選擇器如何工作?通過某種邏輯或自發地從讀取切換到寫入?

回答

1
  1. 沒有這樣的事情,'開關[從讀取]寫入狀態'。套接字可以同時讀寫,並且不會「切換」:它僅報告套接字上存在哪些狀態。

  2. 如果寫入事件從不觸發,這是因爲套接字發送緩衝區已滿,這表示對等方沒有從連接中讀取數據。

+0

這是否意味着如果他們沒有及時閱讀我們的消息,我們將無法發送下一條消息?以某種方式可以刷新緩衝區嗎?現在連webserver重啓都沒有幫助。還有一件事 - 重啓後,我們可以發送第一個消息 - 登錄 - 他們承認它,但然後每一秒卡住 – Diyko 2015-04-03 07:39:35

+0

(a)如果持續時間足夠長,這就是它的意思。 (b)否。(c)您的* server *應用程序中存在錯誤,並且您從望遠鏡的錯誤端看過它。 – EJP 2015-04-03 08:43:59