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條消息)由於未知問題導致我們的合作伙伴切斷連接,因此時常會出現此類負載。我們重新建立連接,但由於某種原因,選擇器不會切換到只寫狀態讀取。我們收到很多消息,但無法發送任何內容。
任何想法?我們這邊是否有操作系統問題?選擇器如何工作?通過某種邏輯或自發地從讀取切換到寫入?
這是否意味着如果他們沒有及時閱讀我們的消息,我們將無法發送下一條消息?以某種方式可以刷新緩衝區嗎?現在連webserver重啓都沒有幫助。還有一件事 - 重啓後,我們可以發送第一個消息 - 登錄 - 他們承認它,但然後每一秒卡住 – Diyko 2015-04-03 07:39:35
(a)如果持續時間足夠長,這就是它的意思。 (b)否。(c)您的* server *應用程序中存在錯誤,並且您從望遠鏡的錯誤端看過它。 – EJP 2015-04-03 08:43:59