首页 > 代码库 > 连接失败重连时间间隔可变

连接失败重连时间间隔可变

hash wheel timer是一种算法,netty用来做心跳超时检查,这个算法有几个共有的属性:Ticks per Wheel (一轮的tick数),Tick Duration(一个tick的持续时间)以及 TimeUnit(时间单位)。关于Tick Duration我感觉应该解释为每一次tick时间间隔。

HashedWheelTimer原文英语注释表达了这样一层意思:

        一个定时器对于近实时I/O网络超时调度。

      *Tick Duration: 如描述“近实时”那样,HashedWheelTimer 不会准时的调度(间隔很少)。每一次tick,将会检查是否会有TimerTask可以调度去执行,你可以在构造器中指定时间长的或时间短的tick duration用来控制调度时间的精准度。

       Ticks per Wheel:HashedWheelTimer维持了一个数据结构称作“时间轮”,一个时间轮hash表的存放是由一个任务死亡时间的hash code决定的。默认大小是512个hash表,如果你需要调度很多的任务超时,你可以加大这个值。


连接失败重连,第一次500毫秒,第二次1000毫秒,....,第n-1次5秒,第n次5秒


连接失败时间间隔最大值5秒

import java.util.concurrent.TimeUnit;

import org.jboss.netty.util.HashedWheelTimer;
import org.jboss.netty.util.Timeout;
import org.jboss.netty.util.Timer;
import org.jboss.netty.util.TimerTask;

public class TimeOutTest {
	public static void main(String[] argv) {
		/*-
		 * Tick Duration(一个tick的持续时间):  
		 *		如描述"近实时"那样,HashedWheelTimer不会准时的调度(间隔很少)。
		 *      每一次tick,将会检查是否会有TimerTask可以调度去执行,
		 *      你可以在构造器中指定时间长的或时间短的tick duration用来控制调度时间的精准度。
		 * 
		 * 可以理解成: 每一次tick时间间隔
		 *---------------------------------------------------------------------------------
		 *	Ticks per Wheel(一轮的tick数): 
		 *		HashedWheelTimer维持了一个数据结构称作"时间轮",
		 *      一个时间轮hash表的存放是由一个任务死亡时间的hash code决定的。
		 *      默认大小是512个hash表,如果你需要调度很多的任务超时,你可以加大这个值。
		 *      
		 * 可以理解成: 允许Timeout的个数,默认是512个。
		 */
		final Timer timer = new HashedWheelTimer(100, TimeUnit.MICROSECONDS);
		timer.newTimeout(new TimerTask() {
			private int t = 0;

			private int count = 1;

			private int step = 500;

			public void run(Timeout timeout) throws Exception {
				System.out.println("本次是延迟 " + t + "毫秒后执行");
				if ((count * step) <= 5 * 1000) {
					t = count * step;
					System.out.println("	下次执行将在延迟 " + t + "毫秒后 第" + count + "次");
					count++;
				}
				timeout.getTimer().newTimeout(timeout.getTask(), t, TimeUnit.MILLISECONDS);
			}
		}, 500, TimeUnit.MILLISECONDS);
	}
}