2009-08-21 16 views
3

私のJava NIOの実装では、SelectionKey.attach()を動作させることができませんでした。基本的には、クライアントが接続すると(OP_ACCEPT interest ops)、それらをIPアドレスがクライアントの状態を維持するオブジェクトにマップするマップに追加します。その後、OP_READが発生すると、クライアントのIPアドレスを再度取得し、今回はマップから値を取得し、クライアントの状態オブジェクトをそのように取得します。Java:SelectionKey.attach()が壊れていますか?

ここでの問題は、マップの参照を毎回行う必要があることです。データはネットワークから読み取られます。そこには無駄な作業がたくさんあります。だから私はあなたがSelectionKey.attachment()を呼び出すときに簡単に取り出せるはずのSelectionKeyに任意のオブジェクト型を付けることができることに興奮していました。 OP_ACCEPT中のマップ)。

問題は機能しないということです。添付ファイルを取得すると、常にnullになります。私がattach()経由で添付ファイルを設定してすぐにattachment()を呼び出すと、それは動作します。どういうわけか違う出来事の間に、それはその関連を失う。

私は申し訳ありませんが、私のコードはここに投稿することが少し長いですが、あなたはこのスレッドのコメントを見れば: link text ...あなたは、いくつかの他は、基本的に同じ結論に達していることが表示されます。 attach()とattachment()は動作しません。

これを動作させるには手間がかかっていますか、マップ内で手動で参照を行うために必要な邪悪なオーバーヘッドに悩まされていますか?

最後に、attachKey()とattachment()を適切に処理する新しいサブクラスにSelectionKeyを「ラップする」方法がありますか?

ありがとうございます!

答えて

6

私は成功しなくてSelectionKeysにオブジェクトを添付しています私がOP_READを初めて取得したときなど、SelectionKeyにオブジェクトをつけて、それ以降の読み込みで取得するとうまくいきます。OP_ACCEPTOP_READは別のキーを扱うかもしれません。私はSelectionKeyが同じ接続のために同じであるべきだと思います...しかし、同じIPから異なる接続をしても、別のSelectionKeysを得るでしょう。

更新:私は自分のコードをチェックしたところ、非常に重要なことがあります。私はattach()を全く呼び出さなかった。私はSelectableChannel.register(Selector sel, int ops, Object att)メソッドを使用しました。これを行うと、SelectionKeyの後続のattachment()の呼び出しが機能します。

+0

ありがとうございました!私が言ったことの組み合わせは、毎回働く解決策につながるかもしれないと思います! :)さらに、attachment()が失敗した場合でも、よりコストのかかるマップのルックアップを行うオプションがあるので、添付ファイルが失われても堅牢に書くことができます!ありがとう! – DivideByHero

+0

これはとても便利です。私はNIOの実装からHashMapを削除することができました。ありがとう! –

+0

この回答に感謝します。私に多くの時間を救った。 – c05mic

1

リンク先ページにCRはありません。bugs.sun.comには何も表示されません。しかし、attach/attachmentもののやや複雑私のbug後(非常に単純なコードです。私の推測では、あなたはそれは無意味だろうラップしようとし、異なるSelectionKeyを取得していることである。