Канал не закрывается после тайм-аута в netty

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

Еще одно наблюдение, когда я проверяю отправителя пакета, чтобы проверить тот же запрос. Я получаю пустой ответ от сервера, но мой 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);
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
317
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

promise.get(60, TimeUnit.SECONDS)

Другие вопросы по теме