Netty Client 重连实现

当我们用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); 
   
  }

参考文档

  • http://stackoverflow.com/questions/19739054/whats-the-best-way-to-reconnect-after-connection-closed-in-netty
  • https://github.com/netty/netty/blob/master/example/src/main/java/io/netty/example/uptime/UptimeClientHandler.java
  • http://tterm.blogspot.jp/2014/03/netty-tcp-client-with-reconnect-handling.html
  • ctx.close vs ctx.channel().close
  • ctx.write vs ctx.channel().write

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值