回答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);
}
}