【问题标题】:How to let netty channel.writeAndFlush() throws Exceptions when no TCP ACK response没有TCP ACK响应时如何让netty channel.writeAndFlush()抛出异常
【发布时间】:2016-04-19 12:24:02
【问题描述】:

我正在开发一个带有 Netty4 框架的 IM 服务器。同时,我使用名为channel.writeAndFlush() 的方法向客户端发送消息。但是,当手机客户端的socket异常关闭时,比如关闭网络连接,或者在设备上开启飞行模式,netty4框架找不到对应的通道处于非活动状态。而且writeAndFlush()方法返回的ChannelGroupFutureChannelGroupFuture.isSuccess()方法报告发送结果成功。 那么,为什么ChannelGroupFuture 没有返回我发送失败而没有抛出任何异常?

ChannelGroupFuture future = connectionService.sendMessageToUser(msgBase, toUid).sync();

future.addListeners(new ChannelGroupFutureListener(){

@Override
                public void operationComplete(ChannelGroupFuture future)
                        throws Exception {
                    if(future.isDone() && future.isSuccess()){
                        chatMessageService.saveSentChatMessage(msgBase);
                    } else if(!future.isSuccess()){
                        chatMessageService.saveUnsentChatMessage(msgBase);
                    }
});

 public ChannelGroupFuture writeAndFlush(Object message, ChannelMatcher matcher) {
    if (message == null) {
        throw new NullPointerException("message");
    }
    if (matcher == null) {
        throw new NullPointerException("matcher");
    }
    if(matcher instanceof AttributeChannelMatcher){
        Map<Channel, ChannelFuture> futures = new LinkedHashMap<Channel, ChannelFuture>(1);
        AttributeChannelMatcher<T>  attributeMatcher = (AttributeChannelMatcher<T>) matcher;
        Channel c = nonServerChannelMap.get(attributeMatcher.getAttributeKeyValue());

        futures.put(c, c.writeAndFlush(safeDuplicate(message)));
        ReferenceCountUtil.release(message);
        return new DefaultChannelGroupFuture(this, futures, executor);
    }else{
        Map<Channel, ChannelFuture> futures = new LinkedHashMap<Channel, ChannelFuture>(size());

        for (Channel c :  nonServerChannelMap.values()) {
            if (matcher.matches(c)) {
                futures.put(c, c.writeAndFlush(safeDuplicate(message)));
            }
        }
        ReferenceCountUtil.release(message);
        return new DefaultChannelGroupFuture(this, futures, executor);
    }
}

【问题讨论】:

    标签: java exception netty


    【解决方案1】:

    你不能。 TCP 写入相对于应用程序是异步的。他们在返回之前不会等待 ACK。发送端有一个发送缓冲区,接收端有一个接收缓冲区。所有这一切意味着在检测到断开的连接之前可能需要多次写入和几秒钟的时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      • 2016-08-14
      • 2017-09-05
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多