1919import net .sf .ehcache .CacheException ;
2020import net .sf .ehcache .CacheManager ;
2121import net .sf .ehcache .Ehcache ;
22+ import org .slf4j .Logger ;
23+ import org .slf4j .LoggerFactory ;
2224
2325import java .io .IOException ;
2426import java .net .InetAddress ;
2527import java .rmi .NotBoundException ;
2628import java .util .ArrayList ;
29+ import java .util .Collections ;
2730import java .util .Date ;
28- import java .util .Iterator ;
31+ import java .util .HashMap ;
2932import java .util .List ;
30-
31- import org .slf4j .Logger ;
32- import org .slf4j .LoggerFactory ;
33+ import java .util .Map ;
3334
3435/**
3536 * A peer provider which discovers peers using Multicast.
5556 * @author Greg Luck
5657 * @version $Id$
5758 */
58- public final class MulticastRMICacheManagerPeerProvider extends RMICacheManagerPeerProvider implements CacheManagerPeerProvider {
59+ public class MulticastRMICacheManagerPeerProvider extends RMICacheManagerPeerProvider implements CacheManagerPeerProvider {
5960
6061 /**
6162 * One tenth of a second, in ms
@@ -64,6 +65,10 @@ public final class MulticastRMICacheManagerPeerProvider extends RMICacheManagerP
6465
6566 private static final Logger LOG = LoggerFactory .getLogger (MulticastRMICacheManagerPeerProvider .class .getName ());
6667
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 <>());
6772
6873 private final MulticastKeepaliveHeartbeatReceiver heartBeatReceiver ;
6974 private final MulticastKeepaliveHeartbeatSender heartBeatSender ;
@@ -79,18 +84,16 @@ public MulticastRMICacheManagerPeerProvider(CacheManager cacheManager, InetAddre
7984 Integer groupMulticastPort , Integer timeToLive , InetAddress hostAddress ) {
8085 super (cacheManager );
8186
82-
83-
8487 heartBeatReceiver = new MulticastKeepaliveHeartbeatReceiver (this , groupMulticastAddress ,
8588 groupMulticastPort , hostAddress );
8689 heartBeatSender = new MulticastKeepaliveHeartbeatSender (cacheManager , groupMulticastAddress ,
87- groupMulticastPort , timeToLive , hostAddress );
90+ groupMulticastPort , timeToLive , hostAddress );
8891 }
8992
9093 /**
9194 * {@inheritDoc}
9295 */
93- public final void init () throws CacheException {
96+ public void init () throws CacheException {
9497 try {
9598 heartBeatReceiver .init ();
9699 heartBeatSender .init ();
@@ -105,11 +108,11 @@ public final void init() throws CacheException {
105108 * <p>
106109 * This method is thread-safe. It relies on peerUrls being a synchronizedMap
107110 *
108- * @param rmiUrl
111+ * @param rmiUrl the URL to register
109112 */
110- public final void registerPeer (String rmiUrl ) {
113+ public void registerPeer (String rmiUrl ) {
111114 try {
112- CachePeerEntry cachePeerEntry = ( CachePeerEntry ) peerUrls .get (rmiUrl );
115+ CachePeerEntry cachePeerEntry = peerUrls .get (rmiUrl );
113116 if (cachePeerEntry == null || stale (cachePeerEntry .date )) {
114117 //can take seconds if there is a problem
115118 CachePeer cachePeer = lookupRemoteCachePeer (rmiUrl );
@@ -119,18 +122,12 @@ public final void registerPeer(String rmiUrl) {
119122 } else {
120123 cachePeerEntry .date = new Date ();
121124 }
122- } catch (IOException e ) {
125+ } catch (IOException | NotBoundException e ) {
123126 if (LOG .isDebugEnabled ()) {
124127 LOG .debug ("Unable to lookup remote cache peer for " + rmiUrl + ". Removing from peer list. Cause was: "
125128 + e .getMessage ());
126129 }
127130 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- }
134131 } catch (Throwable t ) {
135132 LOG .error ("Unable to lookup remote cache peer for " + rmiUrl
136133 + ". 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) {
141138 /**
142139 * @return a list of {@link CachePeer} peers, excluding the local peer.
143140 */
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 " +
163157 "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 );
170160 }
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 );
176163 }
177164 }
165+
166+ // Must remove entries after we have finished iterating over them
167+ staleList .forEach (peerUrls ::remove );
168+
178169 return remoteCachePeers ;
179170 }
180171
181172
182173 /**
183174 * Shutdown the heartbeat
184175 */
185- public final void dispose () {
176+ public void dispose () {
186177 heartBeatSender .dispose ();
187178 heartBeatReceiver .dispose ();
188179 }
@@ -211,51 +202,42 @@ protected long getStaleTime() {
211202 * @param date the date the entry was created
212203 * @return true if stale
213204 */
214- protected final boolean stale (Date date ) {
205+ protected boolean stale (Date date ) {
215206 long now = System .currentTimeMillis ();
216207 return date .getTime () < (now - getStaleTime ());
217208 }
218209
210+ public void unregisterPeer (String rmiUrl ) {
211+ peerUrls .remove (rmiUrl );
212+ }
219213
220214 /**
221215 * Entry containing a looked up CachePeer and date
222216 */
223- protected static final class CachePeerEntry {
217+ private static class CachePeerEntry {
224218
225219 private final CachePeer cachePeer ;
220+
221+ /**
222+ * last access date
223+ */
226224 private Date date ;
227225
228226 /**
229- * Constructor
230227 *
231228 * @param cachePeer the cache peer part of this entry
232229 * @param date the date part of this entry
233230 */
234- public CachePeerEntry (CachePeer cachePeer , Date date ) {
231+ private CachePeerEntry (CachePeer cachePeer , Date date ) {
235232 this .cachePeer = cachePeer ;
236233 this .date = date ;
237234 }
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-
254235 }
255236
256237 /**
257238 * @return the MulticastKeepaliveHeartbeatReceiver
258239 */
240+ @ SuppressWarnings ("unused" )
259241 public MulticastKeepaliveHeartbeatReceiver getHeartBeatReceiver () {
260242 return heartBeatReceiver ;
261243 }
0 commit comments