2009-08-21 9 views
3

Dans mon implémentation de Java NIO, je n'ai pas réussi à faire fonctionner SelectionKey.attach(). Fondamentalement, une fois que les clients se connectent (opérations d'intérêt OP_ACCEPT), je les ajoute à une carte où leur adresse IP correspond à un objet qui maintient l'état pour le client. Puis, quand un OP_READ se produit, je récupère à nouveau l'adresse IP du client, et cette fois obtenir la valeur de la carte et obtenir l'objet d'état du client de cette façon.Java: Est-ce que SelectionKey.attach() est cassé?

Le problème ici est que je dois faire une recherche de carte CHAQUE FOIS les données sont lues sur le réseau. Il y a beaucoup de travail gaspillé. J'ai donc été ravi de voir que vous pouviez attacher un type d'objet arbitraire à une SelectionKey, qui devrait être facilement récupérée lorsque vous appelez SelectionKey.attachment(), même si nous gérons maintenant un événement différent (récupéré pendant OP_READ et mis dans le carte pendant OP_ACCEPT).

Le problème est que cela ne fonctionne pas. Lorsque je récupère la pièce jointe, elle est toujours nulle. Et si je configure la pièce jointe via attach() et que j'appelle immédiatement attachment(), cela fonctionne. D'une manière ou d'une autre entre différents événements, il perd son association.

Je suis désolé, mon code est un peu de temps pour poster ici, mais si vous regardez les commentaires sur ce sujet: link text ... Vous verrez que d'autres sont venus essentiellement à la même conclusion: ce attach() et l'attachement() ne fonctionnent pas, et n'ont jamais.

Y a-t-il un truc pour le faire fonctionner, ou suis-je bloqué avec le mal nécessaire pour faire manuellement une recherche dans une carte CHAQUE FOIS il y a un nouvel événement de lecture à gérer?

Enfin, existe-t-il un moyen d '"encapsuler" SelectionKey dans une nouvelle sous-classe qui gérera correctement attach() et attachment()?

Merci!

Répondre

6

J'ai objets avec succès attachés à SelectionKeys sans par exemple, la première fois que je reçois un OP_READ, j'attache un objet à la SelectionKey et aux lectures suivantes, je le récupère, et cela fonctionne très bien peut-être OP_ACCEPT et OP_READ gérer différentes clés parce qu'elles ' Je pense que SelectionKey devrait être le même pour la même connexion ... Cependant, si vous faites des connexions différentes à partir de la même adresse IP, vous obtiendrez des SelectionKeys différents. UPDATE: Je viens de vérifier mon code et il y a quelque chose de très important: je n'ai pas appelé du tout attach(); J'ai utilisé la méthode SelectableChannel.register(Selector sel, int ops, Object att). Si vous faites cela, les appels suivants à attachment() sur SelectionKey fonctionneront.

+0

Merci beaucoup! Je pense que la combinaison des choses que vous avez mentionnées pourrait conduire à une solution qui fonctionne à chaque fois! :) De plus, si attachment() échoue, j'ai toujours la possibilité de faire une recherche de carte plus coûteuse, donc je peux l'écrire pour être robuste même si la pièce jointe est perdue! Merci! – DivideByHero

+0

C'est très pratique. J'ai été capable de retirer un HashMap de mon implémentation NIO. Merci! –

+0

Reconnaissant pour cette réponse. M'a sauvé beaucoup de temps. – c05mic

1

Il n'y a pas de CR dans votre page liée, et je ne vois rien sur bugs.sun.com. Cependant, attach/attachment est un code très simple (bien qu'un peu plus compliqué après ma bug. Je pense que vous obtenez un SelectionKey différent, donc essayer de l'envelopper serait inutile.

Questions connexes