我有一个带有重新连接监听器的Netty 4.x TCP客户端应用程序,我想不出一种方法来实现将写入套接字 channel 的触发器(HTTP,MQ等)。
到目前为止,我已经尝试通过遵循another example将write(ByteBuf msg)
添加到我的ChannelInboundHandler
中,但是使用我的重新连接监听器,在重新连接时收到以下异常:
... is not a @Sharable handler, so can't be added or removed multiple times.
我是Netty的新手,所以我不确定用户事件触发器是否可以解决此问题。
重新连接代码:
if (!future.isSuccess()) {
future.channel().eventLoop().schedule(() -> {
bootstrap.connect().addListener(this);
}, reconnectDelayTimeNanos, TimeUnit.NANOSECONDS);
} else {
future.channel().closeFuture().addListener((ChannelFuture cf) -> {
bootstrap.connect().addListener(this);
});
}
引导代码:
final MyHandler myHandler = new MyHandler();
final EventLoopGroup requestGroup = new NioEventLoopGroup();
final Bootstrap requestBootstrap = new Bootstrap()
.group(requestGroup)
.channel(NioSocketChannel.class)
.remoteAddress("localhost", 9999)
.option(ChannelOption.SO_KEEPALIVE, true);
requestBootstrap.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(final SocketChannel ch) {
ch.pipeline().addLast(myHandler);
}
});
为了能够使用我的处理程序中的
write(ByteBuf msg)
方法,该处理程序需要在ChannelInitializer
之外有一个引用。我希望能够从触发器(HTTP,MQ等)向管道,不可共享的处理程序等发送消息。
目前,我收到以下异常:
... is not a @Sharable handler, so can't be added or removed multiple times.
最佳答案
您需要通过使用MyHandler
对其进行注释或覆盖@Sharable
方法来将isSharable()
标记为可共享。也就是说,在这种情况下,您需要确保处理程序是线程安全的。