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!
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
C'est très pratique. J'ai été capable de retirer un HashMap de mon implémentation NIO. Merci! –
Reconnaissant pour cette réponse. M'a sauvé beaucoup de temps. – c05mic