Как правильно инициировать TCP-сообщения по требованию для повторно подключаемого, не разделяемого конвейера Netty? - PullRequest
0 голосов
/ 25 января 2019

У меня есть клиентское приложение 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.

1 Ответ

0 голосов
/ 25 января 2019

Вам нужно пометить свой MyHandler как разделяемый, пометив его с помощью @Sharable или переопределив метод isSharable().Тем не менее, в этом случае вам нужно убедиться, что обработчик поточно-ориентирован.

...