文档章节

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
粉丝 76
博文 854
码字总数 746029
作品 0
深圳
私信 提问
Dubbo深入分析之Transport层

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

小刀爱编程
2018/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
Dubbo分析之Transport层

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

ksfzhaohui
2018/10/23
0
0
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 的 ...

淡漠悠然
2018/05/15
1K
7
Apache Qpid JMS 0.38.0,Java Message Service 客户端

Apache Qpid JMS 0.38.0 发布了,Qpid JMS 是一个使用了 Qpid Proton 协议引擎完整的 Java Message Service 2.0 客户端。支持基于 Apache Qpid Proton 协议引擎的高级消息队列协议 1.0(AMQP...

局长
2018/11/20
245
0

没有更多内容

加载失败,请刷新页面

加载更多

vue 对对象的属性进行修改时,不能渲染页面 vue.$set()

我在vue里的方法里给一个对象添加某个属性时,我console.log出来的是已经更改的object ,但是页面始终没有变化 原因如下: **受现代 JavaScript 的限制 (而且 Object.observe 也已经被废弃),...

Js_Mei
今天
2
0
开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
12
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
8
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
5
0
XML

学习目标  能够说出XML的作用  能够编写XML文档声明  能够编写符合语法的XML  能够通过DTD约束编写XML文档  能够通过Schema约束编写XML文档  能够通过Dom4j解析XML文档 第1章 xm...

stars永恒
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部