3

我们已经实现了以下channelIdle实现。

public void channelIdle(ChannelHandlerContext ctx, IdleStateEvent e) 
    throws Exception {

    Response response = business.getResponse();

    final Channel channel = e.getChannel();

    ChannelFuture channelFuture
            = Channels.write(
               channel, 
               ChannelBuffers.wrappedBuffer(response.getXML().getBytes())
    );

    if (response.shouldDisconnect()) {// returns true and listener _is_ added.
        channelFuture.addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture future) throws Exception {
                channel.close(); // never gets called :(
            }
        });
    }
}

在非 SSL 模式下运行时,这将按预期工作。

但是,在启用 SSL 的情况下运行时,该operationComplete方法永远不会被调用。我们已经在各种机器上验证了几次。空闲超时发生了很多次,但operationComplete没有被调用。我们没有看到任何异常被抛出。

我已经尝试跟踪代码以查看operationComplete应该在哪里调用,但它很复杂,我还没有完全弄清楚。

有电话future = succeededFuture(channel); 进来,SslHandler.wrap()但我不知道这是否意味着什么。从返回的未来wrap永远不会在SslHandler代码的其他地方使用。

4

1 回答 1

0

这听起来像一个错误。是否可以编写一个简单的“测试用例”来显示问题并在我们的 github 问题跟踪器 [1] 上打开一个问题。

一定要解释它是一直发生还是偶尔发生等等。

[1] https://github.com/netty/netty/issues

于 2012-09-14T05:21:09.203 回答