Avatar billede dsj Nybegynder
18. august 2003 - 15:55 Der er 2 kommentarer og
1 løsning

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 ?
Avatar billede arne_v Ekspert
18. august 2003 - 16:23 #1
Avatar billede dsj Nybegynder
18. august 2003 - 16:36 #2
Næhhh NIO er en ny ting, men mange fejl er blevet rettet også i den seneste JVM 1.4.2. I øvrigt er der mange tråde i Sun's forum der ligger til grund for at folk ikke ved nok om NIO. Jeg har haft rigtig mange problemer, men de er alle blevet løst henad vejen som jeg har arbejdet med tingene.

Jeg er nået til et punkt hvor min NIO-server fungerer perfekt og har en kanon performance under Linux, men under Windows er der som sagt problemer.

Hvis man kun vil køre Linux er NIO klart at foretrække!

Løsningen bliver nok under Windows at sende data gennem en output-stream. Så skal nævnte problem-metode ikke kaldes og der blokkeres ikke. Det vigtigste er at der kan læses fra klienterne ved brug af en Selector, så vi kan have en dynamisk worker-pool og dermed en skalérbar server :)
Avatar billede dsj Nybegynder
29. september 2003 - 11:38 #3
Lukker - problemet uløst.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester