[netty] netty服务器端,主送发送指令,如果对方客户端未收到,如何设置重新发送??


回答1:
  服务端将channel放到一个发送队列中,如果收到客户端响应的消息,则从队列删除该channel,如果没有,则重发(超过一定时间),这里一般使用定时器来触发。(但需要判断该channel的连通性,如果channel已经close或因网络问题断开,则需要从队列中移除)
 
回答2:
public class MessageHandler extends ChannelInboundHandlerAdapter implements ChannelOutboundHandler {

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        Map newMap = new HashMap<>();
        // 每隔三秒重发一次消息
        ctx.executor().scheduleAtFixedRate(() -> {
            if (map.size() > 0) 
            {
                map.forEach((k, v) -> {
                    ctx.writeAndFlush(v.data);
                    v.times = v.times + 1;
                    if (v.times < 3) 
                    {
                        // 保留未发送三次的。
                        newMap.put(v.id, v);
                    }
                });
            }
            map = newMap;
        }, 3, 3, TimeUnit.SECONDS);
    }
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM