Javaは:SelectionKey.attach()壊れていますか?
-
19-09-2019 - |
質問
は、Java NIOの私の実装では、私はSelectionKey.attachは()仕事を得ることができませんでした。クライアントが(OP_ACCEPT金利OPS)を接続すると、基本的に、私は自分のIPアドレスは、クライアントの状態を維持したオブジェクトにマップマップに追加します。 OP_READが発生した場合に続いて、私は再び、クライアントのIPアドレスを取得し、この時間はマップから値を取得し、クライアントの状態がそのようにオブジェクトを取得ます。
ここでの問題は、私はEVERY TIMEデータは、ネットワークから読み込まれた地図検索をしなければならないということです。そこに行く無駄な仕事がたくさんあります。だから、私たちは今に入れ対OP_READ中に取得(別のイベントを処理している場合でも、あなたはSelectionKey.attachment(呼び出したときに容易に検索する必要があるとSelectionKey、)に任意のオブジェクトタイプを添付することができますことを見て喜んでいましたOP_ACCEPT中のマップ)。
問題は、それが動作しないということです。私は、添付ファイルを取得する場合、それは常にnullです。そして、もし私が(添付経由で添付ファイルを設定)し、その後すぐに)(添付ファイルを呼び出し、それは仕事をしません。どういうわけか、異なるイベントの間、それはその関連付けを失います。
私は申し訳ありませんが、私のコードはここに投稿することが少し長いですが、あなたは、このスレッドのコメントを見れば: リンクテキスト ...あなたは、いくつかの他は、基本的に同じ結論に達していることが表示されます。添付()と添付ファイル()に動作しない、としていたことがないん
それが仕事を得るためにそこにトリックです、または私は手動でマップに処理する新しい読み取りイベントがあるたびに検索を行うための必要悪オーバーヘッドで立ち往生しています!
最後に、適切に取り付けて処理する新しいサブクラス内とSelectionKey()および添付ファイルを()?
「ラップ」する方法がありますありがとうございます。
解決
私は成功したが、同じイベントから、何の問題もなくSelectionKeysにオブジェクトを添付しています。例えば、私はOP_READ
を取得する最初の時間、私はとSelectionKeyにオブジェクトをアタッチし、その後に、私はそれを取得読み込み、それが正常に動作します。たぶんOP_ACCEPT
と異なるキーを扱うOP_READ
彼らはさまざまなイベントだから、私はとSelectionKeyは、同じ接続のために同じである必要があります...しかし、あなたも同じIPから別の接続を行う場合は、別のSelectionKeysを取得します。
UPDATE:私はちょうど私のコードをチェックし、非常に重要なものがある:私はすべての()を呼び出し添付しませんでした。私は SelectableChannel.register(Selector sel, int ops, Object att)
メソッドを使用していました。あなたがそれを行う場合は、とSelectionKeyの添付ファイル()への後続の呼び出しが動作します。
他のヒント
はリンク先のページにはCRがない、と私は bugs.sun.com 。しかし、attach
/ attachment
は、もう少し複雑な私のバグ。私の推測では、あなたが別のSelectionKey
を取得するので、無意味になり、それをラップしようとしているということです。