Канал не закрывается после тайм-аута в Netty - PullRequest
0 голосов
/ 25 октября 2018

Я хочу закрыть канал, если он не получил никаких данных через определенные секунды.Я попробовал IdleHandler, но он не работает.Мой основной обработчик - clientHandler, который расширяет SimpleChannelInboundHandler.Это отправляет данные в виде строки и получает данные в формате String.Иногда я не получаю данные в течение этого времени, я хочу, чтобы мой канал закрывался по истечении определенного времени ожидания, но в настоящее время он ожидает данные с сервера.

Еще одно наблюдение, когда я проверяю отправителя пакета для проверки того же запроса.Я получаю пустой ответ от сервера, но мой ClientHandler не получает этот ответ.

Ниже приведен код.

clientBootstrap.handler(new ChannelInitializer<SocketChannel>() {
                @Override
                public void initChannel(SocketChannel ch){
                    ch.pipeline()
                            .addLast(new IdleStateHandler(5, 5, 10))
                            .addLast(new MyHandler())
                            .addLast(new ClientHandler(cardIssueRequest,promise));
                }
            });

MyHandler:

public class MyHandler extends ChannelDuplexHandler {
    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) {
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent e = (IdleStateEvent) evt;
            if (e.state() == IdleState.READER_IDLE) {
                ctx.close();
            } else if (e.state() == IdleState.WRITER_IDLE) {
                ctx.close();
            }
        }
    }
}

ClientHandler:

public  class ClientHandler extends SimpleChannelInboundHandler {

    RequestModel request;
    private final Promise<String> promise;

    public ClientHandler(RequestModel request, Promise<String> promise) {
        this.request = request;
        this.promise = promise;
    }

    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, Object o) {
        String response = ((ByteBuf) o).toString(CharsetUtil.UTF_8);
        log.info("Client received: " + response);
        promise.trySuccess(response);
    }

    @Override
    public void channelActive(ChannelHandlerContext channelHandlerContext) {
        log.info("Client sent: " + request);
        channelHandlerContext.writeAndFlush(Unpooled.copiedBuffer((request.toString()), CharsetUtil.UTF_8));
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext channelHandlerContext, Throwable cause) {
        cause.printStackTrace();
        channelHandlerContext.close();
        promise.setFailure(cause);
    }
}

1 Ответ

0 голосов
/ 27 октября 2018

После получения дампа потока я обнаружил, что проблема заключалась в том, что моя программа ожидала в операторе обещания.Итак, после установки времени ожидания для обещания моя проблема была решена.

promise.get(60, TimeUnit.SECONDS)
...