J'ai un fournisseur JMS minimal, qui envoie des messages sur le sujet des messages UDP et la file d'attente sur TCP. J'utilise un seul sélecteur pour gérer les clés de sélection UDP et TCP (en enregistrant à la fois SocketChannels et DatagramChannels). Mon problème est: si je n'envoie et ne reçois que des paquets UDP, tout se passe bien, mais dès que je commence à écrire sur un socket TCP (en utilisant Selector.wakeup() pour que le sélecteur fasse l'écriture proprement dite), Le sélecteur entre dans une boucle infinie, renvoyant un jeu de clés de sélection vide et mangeant 100% du processeur.Selector.select() démarre une boucle infinie
Le code de la boucle principale (un peu simplifiée) est:
public void run() {
while (!isInterrupted()) {
try {
selector.select();
} catch (final IOException ex) {
break;
}
final Iterator<SelectionKey> selKeys = selector.selectedKeys().iterator();
while (selKeys.hasNext()) {
final SelectionKey key = selKeys.next();
selKeys.remove();
if (key.isValid()) {
if (key.isReadable()) {
this.read(key);
}
if (key.isConnectable()) {
this.connect(key);
}
if (key.isAcceptable()) {
this.accept(key);
}
if (key.isWritable()) {
this.write(key);
key.cancel();
}
}
}
synchronized(waitingToWrite) {
for (final SelectableChannel channel: waitingToWrite) {
try {
channel.register(selector, SelectionKey.OP_WRITE);
} catch (ClosedChannelException ex) {
// TODO: reopen
}
}
waitingToWrite.clear();
}
}
}
Et pour envoyer UDP (envoi TCP est similaire):
public void udpSend(final String xmlString) throws IOException {
synchronized(outbox) {
outbox.add(xmlString);
}
synchronized(waitingToWrite) {
waitingToWrite.add(dataOutChannel);
}
selector.wakeup();
}
Alors, quel est le problème ici? Dois-je utiliser 2 sélecteurs différents pour gérer les paquets UDP et TCP?
J'ai trouvé quelqu'un qui a un problème similaire: http://web.archiveorange.com/archive/v/xyOAds3Uh2NVesezD5VH. Mais pas encore de solution ... –