簡體   English   中英

網絡超時后頻道未關閉

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM