2013-08-15 6 views
5

Channel.id()はNetty 4.0.0.CR9で削除されました。NettyチャンネルのIDを取得するにはどうすればよいですか?

最近、チャンネルのIDを取得するにはどうすればよいですか?

私は、すべてのハンドラ(たとえば、System.out.println(ctx.channel()。id()+ "readableBytes():" + in.readableBytes() ))。

チャンネルのtoStringメソッドに依存することはできません。これは、オーバーライドされる可能性があるからです。

答えて

9

チャネルがアクティブであることが確かな場合は、hashCode(),remoteAddress()、およびlocalAddress()を組み合わせて、チャネルの一意のIDを生成できます。または、Channel.toString()を使用すると、3つのプロパティから文字列が生成されます。チャネルがまだアクティブでない場合、remoteAddress()localAddress()は意味のある情報を提供しないため、依然として衝突の危険があります。

Netty 4.1および5.0は、ChannelIdという新しいタイプを返すChannel.id()を再導入しました。 MACアドレス、現在のPID、タイムスタンプ、ハッシュコードなどのさまざまな情報を使用するため、グローバルに一意のIDとして使用することもできます。 Javadocを確認してください。

+0

これは最も完全な答えです。 Netty 4はもはやそれを持っていませんが、あなたはものを組み合わせることでそれを得ることができ、Netty 5は再びそれを持っています。ありがとう。 – AndrewBourgeois

+0

Netty 4.1にもあります。 – trustin

+1

チャンネルが非アクティブになったときに変更されるため、Channel.toStringをIDとして使用するように注意してください。 https://github.com/netty/netty/blob/4.0/transport/src/main/java/io/netty/channel /AbstractChannel.java#L352 – justinjhendrick

1

Channel.hashCode()を使用できます。 id()は100%ユニークであることが保証されていないため、削除しました。

+0

hashCodeは一意の値を返すことは保証されていませんか? – AndrewBourgeois

+0

'hashCode()'は一意の値を返すとは限りません。 'Channel.toString()'の使用をお勧めします。すべての 'Channel'実装は実際に' AbstractChannel.toString() 'に依存しています。 – trustin

+0

@trustin:toStringメソッドにはリモートアドレスが含まれているため、一意になります。それを回答として投稿できますか?私は、あなたが時間を見つけたらリモートアドレスを取得できない場合を見ます。 – AndrewBourgeois

関連する問題