Я хочу закрыть канал, если он не получил никаких данных через определенные секунды. Я попробовал 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);
}
}
После создания дампа потока я обнаружил, что проблема в том, что моя программа ожидала в операторе обещания. Итак, после установки тайм-аута для обещания моя проблема была решена.
promise.get(60, TimeUnit.SECONDS)