NIO: SelectionKey.interestOps(int) blokkerer i minutter
Jeg har lavet en multiplayer-server, der håndtere en hel del klienter på samme tid. Indtil fornyelig kørte jeg kun serveren på Linux, men blev nødt til at hoste på Windows 2K Server - et underligt og kritisk problem dukkede op.java.nio anvendes til håndtering af klient-kommunikationen. Serveren har én Selector og når en SelectionKey er klar til skrive eller læse tager Selector'en en Worker fra en pool og overrækker den aktuelle SelectionKey, hvorefter worker'en tager sig af læsningen eller skrivningen.
Når serveren sender data til en klient køres denne metode (Client.sendMessage):
public void sendMessage(Message m) throws CancelledKeyException {
sendQueue.add(m);
if (connected && key.isValid()) {
key.interestOps(key.interestOps() | SelectionKey.OP_WRITE);
key.selector().wakeup();
}
}
Problemet synes at være denne linie:
key.interestOps(key.interestOps() | SelectionKey.OP_WRITE);
...som 50% af gangen blokkerer i 1 - 4 minutter, hvilket IKKE er acceptabelt. Dette problem forekommer slet ikke under Linux.
Nogen der kender en løsning ?
