У меня есть клиентское приложение TCP Netty 4.x с прослушивателем переподключения, и я не могу придумать, как реализовать триггер (HTTP, MQ и т. Д.), Который будет записывать данные в канал сокета.
До сих пор я пытался добавить 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.