【发布时间】:2010-11-21 13:22:19
【问题描述】:
在我的 Java NIO 实现中,我无法让 SelectionKey.attach() 工作。基本上,一旦客户端连接(OP_ACCEPT 兴趣操作),我将它们添加到一个映射中,其中它们的 IP 地址映射到一个为客户端维护状态的对象。然后,当 OP_READ 发生时,我再次检索客户端的 IP 地址,这次从映射中获取值并通过这种方式获取客户端的状态对象。
这里的问题是,每次从网络读取数据时,我都必须进行地图查找。那里有很多浪费的工作。因此,我很高兴看到您可以将任意对象类型附加到 SelectionKey,当您调用 SelectionKey.attachment() 时应该很容易检索到,即使我们现在正在处理不同的事件(在 OP_READ 期间检索而不是放入OP_ACCEPT 期间的地图)。
问题是它不起作用。当我检索附件时,它始终为空。如果我通过 attach() 设置附件,然后立即调用 attachment(),它确实有效。不知何故,在不同的事件之间,它失去了关联。
抱歉,我的代码在这里发布有点长,但是如果您查看此线程中的 cmets: link text ...您会看到其他一些人基本上得出了相同的结论:attach() 和 attachment() 不起作用,而且从来没有。
是否有让它工作的技巧,或者我是否坚持在每次有新的读取事件要处理时手动在地图中进行查找所必需的邪恶开销?
最后,有没有办法在新的子类中“包装” SelectionKey 以正确处理 attach() 和 attachment()?
谢谢!
【问题讨论】:
标签: java nio nonblocking