1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.pool2;
19
20 import java.util.concurrent.atomic.AtomicInteger;
21
22
23
24
25
26
27
28
29 public class Waiter {
30 private static final AtomicInteger instanceCount = new AtomicInteger();
31
32 public static void sleepQuietly(final long millis) {
33 try {
34 Thread.sleep(millis);
35 } catch (final InterruptedException e) {
36
37 }
38 }
39 private boolean active;
40 private boolean valid;
41 private long latency;
42 private long lastPassivatedMillis;
43 private long lastIdleTimeMillis;
44 private long passivationCount;
45 private long validationCount;
46
47 private final int id = instanceCount.getAndIncrement();
48
49 public Waiter(final boolean active, final boolean valid, final long latency) {
50 this.active = active;
51 this.valid = valid;
52 this.latency = latency;
53 this.lastPassivatedMillis = System.currentTimeMillis();
54 }
55
56
57
58
59 public void doWait() {
60 sleepQuietly(latency);
61 }
62
63 @Override
64 public boolean equals(final Object obj) {
65 if (!(obj instanceof Waiter)) {
66 return false;
67 }
68 return obj.hashCode() == id;
69 }
70
71
72
73
74
75
76
77
78
79
80
81 public long getLastIdleTimeMillis() {
82 return lastIdleTimeMillis;
83 }
84
85
86
87
88
89
90
91
92 public long getLastPassivatedMillis() {
93 return lastPassivatedMillis;
94 }
95
96 public long getLatency() {
97 return latency;
98 }
99
100
101
102
103 public long getPassivationCount() {
104 return passivationCount;
105 }
106
107
108
109
110 public long getValidationCount() {
111 return validationCount;
112 }
113
114 @Override
115 public int hashCode() {
116 return id;
117 }
118
119
120
121
122
123
124 public boolean isActive() {
125 return active;
126 }
127
128 public boolean isValid() {
129 validationCount++;
130 return valid;
131 }
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149 public void setActive(final boolean active) {
150 final boolean activeState = this.active;
151 if (activeState == active) {
152 return;
153 }
154 this.active = active;
155 final long currentTimeMillis = System.currentTimeMillis();
156 if (active) {
157 lastIdleTimeMillis = currentTimeMillis - lastPassivatedMillis;
158 } else {
159 lastPassivatedMillis = currentTimeMillis;
160 passivationCount++;
161 }
162 }
163
164 public void setLatency(final long latency) {
165 this.latency = latency;
166 }
167
168 public void setValid(final boolean valid) {
169 this.valid = valid;
170 }
171
172 @Override
173 public String toString() {
174 final StringBuilder buff = new StringBuilder();
175 buff.append("ID = " + id + '\n');
176 buff.append("valid = " + valid + '\n');
177 buff.append("active = " + active + '\n');
178 buff.append("lastPassivated = " + lastPassivatedMillis + '\n');
179 buff.append("lastIdleTimeMs = " + lastIdleTimeMillis + '\n');
180 buff.append("latency = " + latency + '\n');
181 return buff.toString();
182 }
183 }