文档章节

netty的reconnect方式之一

go4it
 go4it
发布于 2016/10/08 17:04
字数 298
阅读 29
收藏 0

##使用timer

bootstrap.setPipelineFactory(
        new ChannelPipelineFactory() {
          public ChannelPipeline getPipeline() {
            final ChannelPipeline p = Channels.pipeline();

            // Reconnections
            p.addLast("reconnect", new ReconnectHandler(
                bootstrap,
                timer,
                reconnectDelay,
                TimeUnit.MILLISECONDS));

###timer

timer = HashedWheelTimerFactory.CreateDaemonHashedWheelTimer();

###HashedWheelTimerFactory

public class HashedWheelTimerFactory {

    public static ThreadFactory daemonThreadFactory = new ThreadFactory() {
        @Override
        public Thread newThread(Runnable r) {
            Thread retVal = Executors.defaultThreadFactory().newThread(r);
            retVal.setDaemon(true);

            return retVal;
        }
    };

    /**
     * Creates hashed wheel timer that uses daemon threads
     *
     * @return HashedWheelTimer
     */
    public static HashedWheelTimer CreateDaemonHashedWheelTimer() {
        return new HashedWheelTimer(daemonThreadFactory);
    }

}

###ReconnectHandler

public class ReconnectHandler extends SimpleChannelUpstreamHandler {
  final Bootstrap bootstrap;
  public final Timer timer;
  public long startTime = -1;
  public final AtomicLong delay;
  public final TimeUnit unit;

  public ReconnectHandler(ClientBootstrap bootstrap, Timer timer, AtomicLong delay, TimeUnit unit) {
    this.bootstrap = bootstrap;
    this.timer = timer;
    this.delay = delay;
    this.unit = unit;
  }
  
  public ReconnectHandler(ConnectionlessBootstrap bootstrap, Timer timer, AtomicLong delay, TimeUnit unit) {
    this.bootstrap = bootstrap;
    this.timer = timer;
    this.delay = delay;
    this.unit = unit;
  }

  InetSocketAddress getRemoteAddress() {
    Resolver resolver = (Resolver) bootstrap.getOption("resolver");
    return resolver.resolve();
  }

  @Override
  public void channelDisconnected(ChannelHandlerContext c, ChannelStateEvent e) throws Exception {
    // Go ahead and close. I don't know why Netty doesn't close disconnected
    // TCP sockets, but it seems not to.
    e.getChannel().close();
    super.channelDisconnected(c, e);
  }

  @Override
  public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
    try {
      timer.newTimeout(new TimerTask() {
        public void run(Timeout timeout) throws Exception {
          if (bootstrap instanceof ClientBootstrap) {
            ClientBootstrap b = (ClientBootstrap) bootstrap;
            b.setOption("remoteAddress", getRemoteAddress());
            b.connect();
          } else if (bootstrap instanceof ConnectionlessBootstrap) {
            ConnectionlessBootstrap b = (ConnectionlessBootstrap) bootstrap;
            b.setOption("remoteAddress", getRemoteAddress());
            b.connect();
          }
        }
      }, delay.get(), unit);
    } catch (java.lang.IllegalStateException ex) {
      // The timer must have been stopped.
    }
    super.channelClosed(ctx, e);
  }

  @Override
  public void channelConnected(ChannelHandlerContext c, ChannelStateEvent e) throws Exception {
    if (startTime < 0) {
      startTime = System.currentTimeMillis();
    }
    super.channelConnected(c, e);
  }

  @Override
  public void exceptionCaught(ChannelHandlerContext c, ExceptionEvent e) {
    final Throwable cause = e.getCause();

    if (cause instanceof ConnectException) {
      startTime = -1;
    } else if (cause instanceof ReadTimeoutException) {
      // The connection was OK but there was no traffic for the last period.
    } else {
     c.sendUpstream(e);
    }
    c.getChannel().close();
  }
}

##docs

© 著作权归作者所有

共有 人打赏支持
go4it
粉丝 71
博文 796
码字总数 640204
作品 0
深圳
私信 提问
Dubbo深入分析之Transport层

Transporter类分析 dubbo为通讯框架提供了统一的bind和connet接口,方便进行管理和扩展,封装在接口类:Transporter中: @SPI("netty") public interface Transporter { @Adaptive({Constant...

小刀爱编程
10/25
0
0
storm 一个报错 Async loop died! & reconnect

Async loop died! 重启任务后发现任务一直异常,日志中有大量reconnect。 b.s.m.n.Client [INFO] Reconnect started for Netty-Client-192.168.1.2/192.168.1.21:6724... [26] telnet到对应级......

wennan
2014/11/07
0
0
Netty5.0 用在android 上

12-14 17:28:38.906 23413-24753/com.dami.tkhxs I/NettyClient: connect failed Unable to create Channel from class class io.netty.channel.socket.nio.NioSocketChannel reconnect dela......

uglyApple
2016/12/14
186
1
Lettuce 5.1.0.M1 发布,带来 5 大功能特性变更

Lettuce 5.1.0.M1 发布,这是 Lettuce 5.1 发布的第一个预览版本,包含改进和错误修复。Lettuce 5.1.0.M1 需要 Java 8,Java 9 或 Java 10 环境。 此次比较显著的变化有: Redis Streams 的 ...

淡漠悠然
05/15
0
0
Dubbo分析之Transport层

系列文章 Dubbo分析Serialize层 Dubbo分析之Transport层 Dubbo分析之Exchange 层 Dubbo分析之Protocol层 前言 上一篇文章Dubbo分析之Serialize层,介绍了最底层的序列化/反序列化层,本文继续...

ksfzhaohui
10/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java.util.Concurrent.Semaphore 源码

类图 源码: package java.util.concurrent;import java.util.Collection;import java.util.concurrent.locks.AbstractQueuedSynchronizer;public class Semaphore implements ja......

狼王黄师傅
17分钟前
2
0
Kubernetes里的secret最基本的用法

Secret解决了密码、token、密钥等敏感数据的配置问题,使用Secret可以避免把这些敏感数据以明文的形式暴露到镜像或者Pod Spec中。 Secret可以以Volume或者环境变量的方式使用。 使用如下命令...

JerryWang_SAP
昨天
2
0
2018-11-20学习笔记

1. python数据类型: 给变量赋值什么样的值,变量就是什么样的类型 给变量赋值整数,变量就是整数类型 给变量赋值字符串,变量就是字符串类型 123 和“123”一样吗? 在python中 单引号 与双...

laoba
昨天
1
0
使用 React 和 Vue 创建相同的应用,他们有什么差异?

在工作中应用 Vue 之后,我对它有了相当深刻的理解。 不过,俗话说「外国的月亮比较圆」,我好奇「外国的」 React 是怎么样的。 我阅读了 React 文档并观看了一些教程视频,虽然它们很棒,但...

阿K1225
昨天
4
0
2天闭门培训|以太坊智能合约从入门到实战(北京)

2天培训 16个课时 探寻技术原理,精通以太坊智能合约开发 以太坊智能合约是现在应用的最广泛的区块链应用开发方式,HiBlock区块链社区针对以太坊智能合约的学习特别推出2天闭门研修班,通过2...

HiBlock
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部