博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Netty Client重连实现
阅读量:5786 次
发布时间:2019-06-18

本文共 2373 字,大约阅读时间需要 7 分钟。

当我们用Netty实现一个TCP client时,我们当然希望当连接断掉的时候Netty能够自动重连。

Netty Client有两种情况下需要重连:

  1. Netty Client启动的时候需要重连
  2. 在程序运行中连接断掉需要重连。

对于第一种情况,Netty的作者在stackoverflow上给出了 ,

对于第二种情况,Netty的例子uptime中实现了一种 。

而Thomas在他的 中提供了这两种方式的实现的例子。

实现ChannelFutureListener 用来启动时监测是否连接成功,不成功的话重试:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
public class Client
{
private EventLoopGroup loop = new NioEventLoopGroup();
public static void main( String[] args )
{
new Client().run();
}
public Bootstrap createBootstrap(Bootstrap bootstrap, EventLoopGroup eventLoop) {
if (bootstrap != null) {
final MyInboundHandler handler = new MyInboundHandler(this);
bootstrap.group(eventLoop);
bootstrap.channel(NioSocketChannel.class);
bootstrap.option(ChannelOption.SO_KEEPALIVE, true);
bootstrap.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline().addLast(handler);
}
});
bootstrap.remoteAddress("localhost", 8888);
bootstrap.connect().addListener(new ConnectionListener(this));
}
return bootstrap;
}
public void run() {
createBootstrap(new Bootstrap(), loop);
}
}

ConnectionListener 负责重连:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
public class ConnectionListener implements ChannelFutureListener {
private Client client;
public ConnectionListener(Client client) {
this.client = client;
}
@Override
public void operationComplete(ChannelFuture channelFuture) throws Exception {
if (!channelFuture.isSuccess()) {
System.out.println("Reconnect");
final EventLoop loop = channelFuture.channel().eventLoop();
loop.schedule(new Runnable() {
@Override
public void run() {
client.createBootstrap(new Bootstrap(), loop);
}
}, 1L, TimeUnit.SECONDS);
}
}
}

同样在ChannelHandler监测连接是否断掉,断掉的话也要重连:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
public class MyInboundHandler extends SimpleChannelInboundHandler {
private Client client;
public MyInboundHandler(Client client) {
this.client = client;
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
final EventLoop eventLoop = ctx.channel().eventLoop();
eventLoop.schedule(new Runnable() {
@Override
public void run() {
client.createBootstrap(new Bootstrap(), eventLoop);
}
}, 1L, TimeUnit.SECONDS);
super.channelInactive(ctx);
}
}

参考文档

  1. 本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/p/5453015.html,如需转载请自行联系原作者
你可能感兴趣的文章
SpringMVC使用注解配置bean
查看>>
BZOJ1202 [HNOI2005]狡猾的商人
查看>>
改变Silverlight插件的下载url
查看>>
BZOJ 2002 LCT板子题
查看>>
python - 接口自动化测试 - contants - 常量封装
查看>>
asp.net easyui 动态绑定下拉框
查看>>
“小程序”初探
查看>>
angularjs结合plupload实现文件上传
查看>>
招商银行的企业网银如何完成银企对账
查看>>
windows下的进程注入
查看>>
抽象工厂,工厂方法和简单工厂的对比
查看>>
Zookeeper
查看>>
apache配置
查看>>
树dp...吧 ZOJ 3949
查看>>
如何查看Linux操作系统版本
查看>>
js函数中参数的传递
查看>>
(2)javascript的基本语法、数据结构、变量
查看>>
软件业的“敏捷流程”(转载)
查看>>
Java判断素数
查看>>
转:测试反射调用私有方法/私有静态方法
查看>>