netty4.0 最終版にアップデートしましたが、Channel.id() が削除されました。
メッセージサーバーをクライアントに送信するために主導権を握る必要があります。適切なチャネルを見つける方法は? クライアントに返された完了ハンドラーを直接処理することはありませんが、プロセスを別のサーバーに転送してから、クライアントに送信するために戻る必要があります。
Channel.id () を使用する前に行うことができますが、Channel.id () は削除されています。
私は簡単なカウンターを作りました:
public class SimpleChannel extends NioSocketChannel {
protected static final AtomicLong nextId = new AtomicLong(0);
protected long id = nextId.getAndIncrement();
public SimpleChannel() {
}
public SimpleChannel(SocketChannel socket) {
super(socket);
}
public SimpleChannel(Channel parent, Integer id, SocketChannel socket) {
super(parent, id, socket);
}
public long getId() {
return id;
}
}
カスタム クラスを Bootstrap に設定する:
EventLoopGroup workerGroup = new NioEventLoopGroup();
Bootstrap clientFactory = new Bootstrap();
clientFactory.group(workerGroup);
clientFactory.channel(SimpleChannel.class);
サーバーの場合はもう少し難しい:
public class SimpleServerChannel extends NioServerSocketChannel {
private static final InternalLogger log = InternalLoggerFactory.getInstance(HttpServerChannel.class);
@Override
protected int doReadMessages(List<Object> buf) throws Exception {
SocketChannel ch = javaChannel().accept();
try {
if (ch != null) {
buf.add(new SimpleChannel(this, ch));
return 1;
}
} catch (Throwable t) {
log.warn("Failed to create a new channel from an accepted socket.", t);
try {
ch.close();
} catch (Throwable t2) {
log.warn("Failed to close a socket.", t2);
}
}
return 0;
}
}
カスタム クラスを ServerBootstrap に設定します。
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup);
b.channel(SimpleServerChannel.class);
この削除に関して、Github でいくつかの問題が提起されています。Norman は、 Channel.hashcode() を使用できることを示していますが、一意であるとは保証されていません。
https://github.com/netty/netty/pull/1540
もう 1 つのアイデアは、カスタム ChannelGroup を作成することですが、それには独自の複雑さが伴います。ここで簡単に説明します。