问题
刚开始使用netty,并未考虑服务端网络问题,但是今天发现有几次出现客户端发送成功,但是服务端未收到消息的情况,这才开始考虑客户端重连问题。
方案
netty本身提供断开连接通知,客户端需要在收到通知后,编写代码进行重新连接即可。
步骤
- 自定义处理类NettyClientHandler继承ChannelInboundHandlerAdapter,实现其方法,如下图:
@Override
public void channelInactive(ChannelHandlerContext ctx){
logger.error("掉线了...");
logger.error("channelInactive:{}", ctx.channel().localAddress());
try{
super.channelInactive(ctx);
nettyClient.connectAsync();
logger.error("重连完成");
}catch (Exception e){
logger.error("重连失败:{}", ExceptionUtils.getStackTrace(e));
}
}
2.connectAsync方法实现真正的重连:
public void connectAsync() {
logger.error("尝试连接到服务端: {}:{}",host,port);
try {
ChannelFuture channelFuture = bootstrap.connect(host, port);
channelFuture.addListener((ChannelFutureListener) future -> {
if (!future.isSuccess()) {
logger.error("等待下一次重连");
ScheduledFuture scheduledFuture = null;
try{
scheduledFuture=future.channel().eventLoop().schedule(() -> {
logger.error("scheduler------------------start");
connectAsync();
logger.error("scheduler------------------end");
}, 1, TimeUnit.SECONDS);
logger.error("end:{}",scheduledFuture.isDone());
}catch (Exception e){
logger.error("error:{}",ExceptionUtils.getStackTrace(e));
}
} else {
logger.error("Netty client started !!! {} connect to server", channel.localAddress());
channel = future.channel();
}
});
}catch (Exception e){
logger.error("重连出错:{}",ExceptionUtils.getStackTrace(e));
}
}
netty都是异步操作,连接之后,需要添加监听,在监听内部获取是否连接成功的通知,如果失败,则使用异步的线程重新执行该方法,直到成功;成功则直接退出。
问题
目前,还未考虑:在重连的过程中,客户端还是未发送消息给服务端,需要在发现断开连接之后,则停止消息发送,直到连接成功!!