Java:SelectionKey.attach()坏了吗?

时间:2009-08-21 04:20:29

标签: java nio nonblocking

在我的Java NIO实现中,我无法使SelectionKey.attach()工作。基本上,一旦客户端连接(OP_ACCEPT兴趣操作),我将它们添加到一个地图,在那里他们的IP地址映射到一个维护客户端状态的对象。然后,当OP_READ发生时,我再次检索客户端的IP地址,这次从地图中获取值并以此方式获取客户端的状态对象。

这里的问题是我必须进行地图查找每次从网络读取数据。那里有很多浪费的工作。所以,我很高兴看到你可以将一个任意对象类型附加到SelectionKey,当你调用SelectionKey.attachment()时,它应该很容易被检索,即使我们现在正处理一个不同的事件(在OP_READ期间检索而不是放入OP_ACCEPT期间的地图。

问题在于它不起作用。当我检索附件时,它始终为null。如果我通过attach()设置附件然后立即调用attachment(),它确实有效。在某些不同的事件之间,它失去了它的联系。

对不起,我的代码在这里发帖有点长,但如果你看一下这个帖子中的评论: link text ......你会看到其他一些人基本上得出了相同的结论:attach()和attachment()不起作用,而且从来没有。

是否有诀窍让它发挥作用,或者我是否陷入了在地图中手动执行查找所需的恶劣开销每次都有新的读取事件需要处理?

最后,有没有办法在一个新的子类中“包装”SelectionKey,以正确处理attach()和attachment()?

谢谢!

2 个答案:

答案 0 :(得分:6)

我已成功将对象附加到SelectionKeys而没有任何问题,但仅来自同一事件。例如,当我第一次得到OP_READ时,我将一个对象附加到SelectionKey,并在随后的读取中检索它,它工作正常。也许OP_ACCEPTOP_READ处理不同的密钥,因为它们是不同的事件,但我认为SelectionKey对于同一个连接应该是相同的...但是如果你使用相同的IP建立不同的连接你会得到不同的SelectionKeys。

更新:我刚检查了我的代码并且有一些非常重要的东西:我根本没有调用attach();我使用了 SelectableChannel.register(Selector sel, int ops, Object att)方法。如果这样做,后续调用SelectionKey上的attachment()将起作用。

答案 1 :(得分:1)

您的链接页面中没有CR,我在bugs.sun.com上看不到任何内容。但是,attach / attachment是非常简单的代码(虽然在bug之后稍微复杂一些。我的猜测是你获得了不同的SelectionKey,所以试图包装它没有意义。

相关问题