我有一个带有重新连接监听器的Netty 4.x TCP客户端应用程序,我想不出一种方法来实现将写入套接字 channel 的触发器(HTTP,MQ等)。

到目前为止,我已经尝试通过遵循another examplewrite(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()标记为可共享。也就是说,在这种情况下,您需要确保处理程序是线程安全的。

10-05 22:26