1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 package net.rubyeye.xmemcached.impl;
24
25 import java.util.concurrent.Delayed;
26 import java.util.concurrent.TimeUnit;
27
28 import net.rubyeye.xmemcached.utils.InetSocketAddressWrapper;
29
30
31
32
33
34
35
36
37 public final class ReconnectRequest implements Delayed {
38
39 private InetSocketAddressWrapper inetSocketAddressWrapper;
40 private int tries;
41
42 private static final long MIN_RECONNECT_INTERVAL = 1000;
43
44 private static final long MAX_RECONNECT_INTERVAL = 60 * 1000;
45
46 private volatile long nextReconnectTimestamp;
47
48
49 public ReconnectRequest(InetSocketAddressWrapper inetSocketAddressWrapper, int tries, long reconnectInterval) {
50 super();
51 this.setInetSocketAddressWrapper(inetSocketAddressWrapper);
52 this.setTries(tries);
53 reconnectInterval = this.normalInterval(reconnectInterval);
54 this.nextReconnectTimestamp = System.currentTimeMillis() + reconnectInterval;
55 }
56
57
58 private long normalInterval(long reconnectInterval) {
59 if (reconnectInterval < MIN_RECONNECT_INTERVAL) {
60 reconnectInterval = MIN_RECONNECT_INTERVAL;
61 }
62 if (reconnectInterval > MAX_RECONNECT_INTERVAL) {
63 reconnectInterval = MAX_RECONNECT_INTERVAL;
64 }
65 return reconnectInterval;
66 }
67
68
69 public long getDelay(TimeUnit unit) {
70 return unit.convert(this.nextReconnectTimestamp - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
71 }
72
73
74 public int compareTo(Delayed o) {
75 ReconnectRequest other = (ReconnectRequest) o;
76 if (this.nextReconnectTimestamp > other.nextReconnectTimestamp) {
77 return 1;
78 }
79 else {
80 return -1;
81 }
82 }
83
84
85
86
87
88
89
90
91 public final InetSocketAddressWrapper getInetSocketAddressWrapper() {
92 return this.inetSocketAddressWrapper;
93 }
94
95
96 public void updateNextReconnectTimeStamp(long interval) {
97 interval = this.normalInterval(interval);
98 this.nextReconnectTimestamp = System.currentTimeMillis() + interval;
99 }
100
101
102 public final void setInetSocketAddressWrapper(InetSocketAddressWrapper inetSocketAddressWrapper) {
103 this.inetSocketAddressWrapper = inetSocketAddressWrapper;
104 }
105
106
107 public final void setTries(int tries) {
108 this.tries = tries;
109 }
110
111
112
113
114
115
116
117 public final int getTries() {
118 return this.tries;
119 }
120
121 }