[英]Channel not closing after timeout in 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);
}
}
進行線程轉儲后,我發現問題是我的程序正在promise語句中等待。 因此,在為承諾設置超時后,我的問題解決了。
promise.get(60, TimeUnit.SECONDS)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.