[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