19
19
import net .sf .ehcache .CacheException ;
20
20
import net .sf .ehcache .CacheManager ;
21
21
import net .sf .ehcache .Ehcache ;
22
+ import org .slf4j .Logger ;
23
+ import org .slf4j .LoggerFactory ;
22
24
23
25
import java .io .IOException ;
24
26
import java .net .InetAddress ;
25
27
import java .rmi .NotBoundException ;
26
28
import java .util .ArrayList ;
29
+ import java .util .Collections ;
27
30
import java .util .Date ;
28
- import java .util .Iterator ;
31
+ import java .util .HashMap ;
29
32
import java .util .List ;
30
-
31
- import org .slf4j .Logger ;
32
- import org .slf4j .LoggerFactory ;
33
+ import java .util .Map ;
33
34
34
35
/**
35
36
* A peer provider which discovers peers using Multicast.
55
56
* @author Greg Luck
56
57
* @version $Id$
57
58
*/
58
- public final class MulticastRMICacheManagerPeerProvider extends RMICacheManagerPeerProvider implements CacheManagerPeerProvider {
59
+ public class MulticastRMICacheManagerPeerProvider extends RMICacheManagerPeerProvider implements CacheManagerPeerProvider {
59
60
60
61
/**
61
62
* One tenth of a second, in ms
@@ -64,6 +65,10 @@ public final class MulticastRMICacheManagerPeerProvider extends RMICacheManagerP
64
65
65
66
private static final Logger LOG = LoggerFactory .getLogger (MulticastRMICacheManagerPeerProvider .class .getName ());
66
67
68
+ /**
69
+ * Contains a RMI URLs of the form: "//" + hostName + ":" + port + "/" + cacheName as key
70
+ */
71
+ protected final Map <String , CachePeerEntry > peerUrls = Collections .synchronizedMap (new HashMap <>());
67
72
68
73
private final MulticastKeepaliveHeartbeatReceiver heartBeatReceiver ;
69
74
private final MulticastKeepaliveHeartbeatSender heartBeatSender ;
@@ -79,18 +84,16 @@ public MulticastRMICacheManagerPeerProvider(CacheManager cacheManager, InetAddre
79
84
Integer groupMulticastPort , Integer timeToLive , InetAddress hostAddress ) {
80
85
super (cacheManager );
81
86
82
-
83
-
84
87
heartBeatReceiver = new MulticastKeepaliveHeartbeatReceiver (this , groupMulticastAddress ,
85
88
groupMulticastPort , hostAddress );
86
89
heartBeatSender = new MulticastKeepaliveHeartbeatSender (cacheManager , groupMulticastAddress ,
87
- groupMulticastPort , timeToLive , hostAddress );
90
+ groupMulticastPort , timeToLive , hostAddress );
88
91
}
89
92
90
93
/**
91
94
* {@inheritDoc}
92
95
*/
93
- public final void init () throws CacheException {
96
+ public void init () throws CacheException {
94
97
try {
95
98
heartBeatReceiver .init ();
96
99
heartBeatSender .init ();
@@ -105,11 +108,11 @@ public final void init() throws CacheException {
105
108
* <p>
106
109
* This method is thread-safe. It relies on peerUrls being a synchronizedMap
107
110
*
108
- * @param rmiUrl
111
+ * @param rmiUrl the URL to register
109
112
*/
110
- public final void registerPeer (String rmiUrl ) {
113
+ public void registerPeer (String rmiUrl ) {
111
114
try {
112
- CachePeerEntry cachePeerEntry = ( CachePeerEntry ) peerUrls .get (rmiUrl );
115
+ CachePeerEntry cachePeerEntry = peerUrls .get (rmiUrl );
113
116
if (cachePeerEntry == null || stale (cachePeerEntry .date )) {
114
117
//can take seconds if there is a problem
115
118
CachePeer cachePeer = lookupRemoteCachePeer (rmiUrl );
@@ -119,18 +122,12 @@ public final void registerPeer(String rmiUrl) {
119
122
} else {
120
123
cachePeerEntry .date = new Date ();
121
124
}
122
- } catch (IOException e ) {
125
+ } catch (IOException | NotBoundException e ) {
123
126
if (LOG .isDebugEnabled ()) {
124
127
LOG .debug ("Unable to lookup remote cache peer for " + rmiUrl + ". Removing from peer list. Cause was: "
125
128
+ e .getMessage ());
126
129
}
127
130
unregisterPeer (rmiUrl );
128
- } catch (NotBoundException e ) {
129
- peerUrls .remove (rmiUrl );
130
- if (LOG .isDebugEnabled ()) {
131
- LOG .debug ("Unable to lookup remote cache peer for " + rmiUrl + ". Removing from peer list. Cause was: "
132
- + e .getMessage ());
133
- }
134
131
} catch (Throwable t ) {
135
132
LOG .error ("Unable to lookup remote cache peer for " + rmiUrl
136
133
+ ". Cause was not due to an IOException or NotBoundException which will occur in normal operation:" +
@@ -141,48 +138,42 @@ public final void registerPeer(String rmiUrl) {
141
138
/**
142
139
* @return a list of {@link CachePeer} peers, excluding the local peer.
143
140
*/
144
- public final synchronized List listRemoteCachePeers (Ehcache cache ) throws CacheException {
145
- List remoteCachePeers = new ArrayList ();
146
- List staleList = new ArrayList ();
147
- synchronized (peerUrls ) {
148
- for (Iterator iterator = peerUrls .keySet ().iterator (); iterator .hasNext ();) {
149
- String rmiUrl = (String ) iterator .next ();
150
- String rmiUrlCacheName = extractCacheName (rmiUrl );
151
- try {
152
- if (!rmiUrlCacheName .equals (cache .getName ())) {
153
- continue ;
154
- }
155
- CachePeerEntry cachePeerEntry = (CachePeerEntry ) peerUrls .get (rmiUrl );
156
- Date date = cachePeerEntry .date ;
157
- if (!stale (date )) {
158
- CachePeer cachePeer = cachePeerEntry .cachePeer ;
159
- remoteCachePeers .add (cachePeer );
160
- } else {
161
-
162
- LOG .debug ("rmiUrl is stale. Either the remote peer is shutdown or the " +
141
+ public synchronized List <CachePeer > listRemoteCachePeers (Ehcache cache ) throws CacheException {
142
+ List <CachePeer > remoteCachePeers = new ArrayList <>();
143
+ List <String > staleList = new ArrayList <>();
144
+
145
+ for (Map .Entry <String , CachePeerEntry > entry : peerUrls .entrySet ()) {
146
+ String rmiUrl = entry .getKey ();
147
+ String rmiUrlCacheName = extractCacheName (rmiUrl );
148
+ if (!rmiUrlCacheName .equals (cache .getName ())) {
149
+ continue ;
150
+ }
151
+ try {
152
+ CachePeerEntry cachePeerEntry = entry .getValue ();
153
+ if (!stale (cachePeerEntry .date )) {
154
+ remoteCachePeers .add (cachePeerEntry .cachePeer );
155
+ } else {
156
+ LOG .debug ("rmiUrl '{}' is stale. Either the remote peer is shutdown or the " +
163
157
"network connectivity has been interrupted. Will be removed from list of remote cache peers" ,
164
- rmiUrl );
165
- staleList .add (rmiUrl );
166
- }
167
- } catch (Exception exception ) {
168
- LOG .error (exception .getMessage (), exception );
169
- throw new CacheException ("Unable to list remote cache peers. Error was " + exception .getMessage ());
158
+ rmiUrl );
159
+ staleList .add (rmiUrl );
170
160
}
171
- }
172
- //Must remove entries after we have finished iterating over them
173
- for (int i = 0 ; i < staleList .size (); i ++) {
174
- String rmiUrl = (String ) staleList .get (i );
175
- peerUrls .remove (rmiUrl );
161
+ } catch (Exception exception ) {
162
+ throw new CacheException ("Unable to list remote cache peers." , exception );
176
163
}
177
164
}
165
+
166
+ // Must remove entries after we have finished iterating over them
167
+ staleList .forEach (peerUrls ::remove );
168
+
178
169
return remoteCachePeers ;
179
170
}
180
171
181
172
182
173
/**
183
174
* Shutdown the heartbeat
184
175
*/
185
- public final void dispose () {
176
+ public void dispose () {
186
177
heartBeatSender .dispose ();
187
178
heartBeatReceiver .dispose ();
188
179
}
@@ -211,51 +202,42 @@ protected long getStaleTime() {
211
202
* @param date the date the entry was created
212
203
* @return true if stale
213
204
*/
214
- protected final boolean stale (Date date ) {
205
+ protected boolean stale (Date date ) {
215
206
long now = System .currentTimeMillis ();
216
207
return date .getTime () < (now - getStaleTime ());
217
208
}
218
209
210
+ public void unregisterPeer (String rmiUrl ) {
211
+ peerUrls .remove (rmiUrl );
212
+ }
219
213
220
214
/**
221
215
* Entry containing a looked up CachePeer and date
222
216
*/
223
- protected static final class CachePeerEntry {
217
+ private static class CachePeerEntry {
224
218
225
219
private final CachePeer cachePeer ;
220
+
221
+ /**
222
+ * last access date
223
+ */
226
224
private Date date ;
227
225
228
226
/**
229
- * Constructor
230
227
*
231
228
* @param cachePeer the cache peer part of this entry
232
229
* @param date the date part of this entry
233
230
*/
234
- public CachePeerEntry (CachePeer cachePeer , Date date ) {
231
+ private CachePeerEntry (CachePeer cachePeer , Date date ) {
235
232
this .cachePeer = cachePeer ;
236
233
this .date = date ;
237
234
}
238
-
239
- /**
240
- * @return the cache peer part of this entry
241
- */
242
- public final CachePeer getCachePeer () {
243
- return cachePeer ;
244
- }
245
-
246
-
247
- /**
248
- * @return the date part of this entry
249
- */
250
- public final Date getDate () {
251
- return date ;
252
- }
253
-
254
235
}
255
236
256
237
/**
257
238
* @return the MulticastKeepaliveHeartbeatReceiver
258
239
*/
240
+ @ SuppressWarnings ("unused" )
259
241
public MulticastKeepaliveHeartbeatReceiver getHeartBeatReceiver () {
260
242
return heartBeatReceiver ;
261
243
}
0 commit comments