diff --git a/.gitignore b/.gitignore index 50952b52e0..a455ace168 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ -/.classpath -/.project -/target -/.settings -/*.iml +.classpath +.project +target +.settings +*.iml + +.idea diff --git a/ehcache-core/src/main/java/net/sf/ehcache/distribution/ManualRMICacheManagerPeerProvider.java b/ehcache-core/src/main/java/net/sf/ehcache/distribution/ManualRMICacheManagerPeerProvider.java index f677278c72..85f0a22e0e 100644 --- a/ehcache-core/src/main/java/net/sf/ehcache/distribution/ManualRMICacheManagerPeerProvider.java +++ b/ehcache-core/src/main/java/net/sf/ehcache/distribution/ManualRMICacheManagerPeerProvider.java @@ -19,14 +19,14 @@ import net.sf.ehcache.CacheException; import net.sf.ehcache.Ehcache; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.ArrayList; -import java.util.Date; -import java.util.Iterator; +import java.util.Collections; +import java.util.HashSet; import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.util.Set; /** * A provider of Peer RMI addresses based off manual configuration. @@ -38,10 +38,15 @@ * @author Greg Luck * @version $Id$ */ -public final class ManualRMICacheManagerPeerProvider extends RMICacheManagerPeerProvider { +public class ManualRMICacheManagerPeerProvider extends RMICacheManagerPeerProvider { private static final Logger LOG = LoggerFactory.getLogger(ManualRMICacheManagerPeerProvider.class.getName()); + /** + * Contains a RMI URLs of the form: "//" + hostName + ":" + port + "/" + cacheName; + */ + protected final Set peerUrls = Collections.synchronizedSet(new HashSet<>()); + /** * Empty constructor. */ @@ -52,7 +57,7 @@ public ManualRMICacheManagerPeerProvider() { /** * {@inheritDoc} */ - public final void init() { + public void init() { //nothing to do here } @@ -65,68 +70,37 @@ public long getTimeForClusterToForm() { return 0; } - /** - * Register a new peer. - * - * @param rmiUrl - */ - public final synchronized void registerPeer(String rmiUrl) { - peerUrls.put(rmiUrl, new Date()); + @Override + public synchronized void registerPeer(String rmiUrl) { + peerUrls.add(rmiUrl); } - /** - * @return a list of {@link CachePeer} peers, excluding the local peer. - */ - public final synchronized List listRemoteCachePeers(Ehcache cache) throws CacheException { - List remoteCachePeers = new ArrayList(); - List staleList = new ArrayList(); - for (Iterator iterator = peerUrls.keySet().iterator(); iterator.hasNext();) { - String rmiUrl = (String) iterator.next(); + @Override + public synchronized List listRemoteCachePeers(Ehcache cache) throws CacheException { + List remoteCachePeers = new ArrayList<>(); + for (String rmiUrl : peerUrls) { String rmiUrlCacheName = extractCacheName(rmiUrl); if (!rmiUrlCacheName.equals(cache.getName())) { continue; } - Date date = (Date) peerUrls.get(rmiUrl); - if (!stale(date)) { - CachePeer cachePeer = null; - try { - cachePeer = lookupRemoteCachePeer(rmiUrl); - remoteCachePeers.add(cachePeer); - } catch (Exception e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Looking up rmiUrl " + rmiUrl + " through exception " + e.getMessage() - + ". This may be normal if a node has gone offline. Or it may indicate network connectivity" - + " difficulties", e); - } + + try { + remoteCachePeers.add(lookupRemoteCachePeer(rmiUrl)); + } catch (Exception e) { + if (LOG.isDebugEnabled()) { + LOG.debug("Looking up rmiUrl {} through exception. This may be normal if a node has gone offline. Or it may indicate network connectivity difficulties", + rmiUrl, e); } - } else { - LOG.debug("rmiUrl {} should never be stale for a manually configured cluster.", rmiUrl); - staleList.add(rmiUrl); } - } - //Remove any stale remote peers. Must be done here to avoid concurrent modification exception. - for (int i = 0; i < staleList.size(); i++) { - String rmiUrl = (String) staleList.get(i); - peerUrls.remove(rmiUrl); - } return remoteCachePeers; } - - /** - * Whether the entry should be considered stale. - *

- * Manual RMICacheManagerProviders use a static list of urls and are therefore never stale. - * - * @param date the date the entry was created - * @return true if stale - */ - protected final boolean stale(Date date) { - return false; + @Override + public void unregisterPeer(String rmiUrl) { + peerUrls.remove(rmiUrl); } - } diff --git a/ehcache-core/src/main/java/net/sf/ehcache/distribution/MulticastRMICacheManagerPeerProvider.java b/ehcache-core/src/main/java/net/sf/ehcache/distribution/MulticastRMICacheManagerPeerProvider.java index 2647d8b4e3..4b884a649a 100644 --- a/ehcache-core/src/main/java/net/sf/ehcache/distribution/MulticastRMICacheManagerPeerProvider.java +++ b/ehcache-core/src/main/java/net/sf/ehcache/distribution/MulticastRMICacheManagerPeerProvider.java @@ -19,17 +19,18 @@ import net.sf.ehcache.CacheException; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Ehcache; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; import java.net.InetAddress; import java.rmi.NotBoundException; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; -import java.util.Iterator; +import java.util.HashMap; import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.util.Map; /** * A peer provider which discovers peers using Multicast. @@ -55,7 +56,7 @@ * @author Greg Luck * @version $Id$ */ -public final class MulticastRMICacheManagerPeerProvider extends RMICacheManagerPeerProvider implements CacheManagerPeerProvider { +public class MulticastRMICacheManagerPeerProvider extends RMICacheManagerPeerProvider implements CacheManagerPeerProvider { /** * One tenth of a second, in ms @@ -64,6 +65,10 @@ public final class MulticastRMICacheManagerPeerProvider extends RMICacheManagerP private static final Logger LOG = LoggerFactory.getLogger(MulticastRMICacheManagerPeerProvider.class.getName()); + /** + * Contains a RMI URLs of the form: "//" + hostName + ":" + port + "/" + cacheName as key + */ + protected final Map peerUrls = Collections.synchronizedMap(new HashMap<>()); private final MulticastKeepaliveHeartbeatReceiver heartBeatReceiver; private final MulticastKeepaliveHeartbeatSender heartBeatSender; @@ -79,18 +84,16 @@ public MulticastRMICacheManagerPeerProvider(CacheManager cacheManager, InetAddre Integer groupMulticastPort, Integer timeToLive, InetAddress hostAddress) { super(cacheManager); - - heartBeatReceiver = new MulticastKeepaliveHeartbeatReceiver(this, groupMulticastAddress, groupMulticastPort, hostAddress); heartBeatSender = new MulticastKeepaliveHeartbeatSender(cacheManager, groupMulticastAddress, - groupMulticastPort, timeToLive, hostAddress); + groupMulticastPort, timeToLive, hostAddress); } /** * {@inheritDoc} */ - public final void init() throws CacheException { + public void init() throws CacheException { try { heartBeatReceiver.init(); heartBeatSender.init(); @@ -105,11 +108,11 @@ public final void init() throws CacheException { *

* This method is thread-safe. It relies on peerUrls being a synchronizedMap * - * @param rmiUrl + * @param rmiUrl the URL to register */ - public final void registerPeer(String rmiUrl) { + public void registerPeer(String rmiUrl) { try { - CachePeerEntry cachePeerEntry = (CachePeerEntry) peerUrls.get(rmiUrl); + CachePeerEntry cachePeerEntry = peerUrls.get(rmiUrl); if (cachePeerEntry == null || stale(cachePeerEntry.date)) { //can take seconds if there is a problem CachePeer cachePeer = lookupRemoteCachePeer(rmiUrl); @@ -119,18 +122,12 @@ public final void registerPeer(String rmiUrl) { } else { cachePeerEntry.date = new Date(); } - } catch (IOException e) { + } catch (IOException | NotBoundException e) { if (LOG.isDebugEnabled()) { LOG.debug("Unable to lookup remote cache peer for " + rmiUrl + ". Removing from peer list. Cause was: " + e.getMessage()); } unregisterPeer(rmiUrl); - } catch (NotBoundException e) { - peerUrls.remove(rmiUrl); - if (LOG.isDebugEnabled()) { - LOG.debug("Unable to lookup remote cache peer for " + rmiUrl + ". Removing from peer list. Cause was: " - + e.getMessage()); - } } catch (Throwable t) { LOG.error("Unable to lookup remote cache peer for " + rmiUrl + ". Cause was not due to an IOException or NotBoundException which will occur in normal operation:" + @@ -141,40 +138,34 @@ public final void registerPeer(String rmiUrl) { /** * @return a list of {@link CachePeer} peers, excluding the local peer. */ - public final synchronized List listRemoteCachePeers(Ehcache cache) throws CacheException { - List remoteCachePeers = new ArrayList(); - List staleList = new ArrayList(); - synchronized (peerUrls) { - for (Iterator iterator = peerUrls.keySet().iterator(); iterator.hasNext();) { - String rmiUrl = (String) iterator.next(); - String rmiUrlCacheName = extractCacheName(rmiUrl); - try { - if (!rmiUrlCacheName.equals(cache.getName())) { - continue; - } - CachePeerEntry cachePeerEntry = (CachePeerEntry) peerUrls.get(rmiUrl); - Date date = cachePeerEntry.date; - if (!stale(date)) { - CachePeer cachePeer = cachePeerEntry.cachePeer; - remoteCachePeers.add(cachePeer); - } else { - - LOG.debug("rmiUrl is stale. Either the remote peer is shutdown or the " + + public synchronized List listRemoteCachePeers(Ehcache cache) throws CacheException { + List remoteCachePeers = new ArrayList<>(); + List staleList = new ArrayList<>(); + + for (Map.Entry entry : peerUrls.entrySet()) { + String rmiUrl = entry.getKey(); + String rmiUrlCacheName = extractCacheName(rmiUrl); + if (!rmiUrlCacheName.equals(cache.getName())) { + continue; + } + try { + CachePeerEntry cachePeerEntry = entry.getValue(); + if (!stale(cachePeerEntry.date)) { + remoteCachePeers.add(cachePeerEntry.cachePeer); + } else { + LOG.debug("rmiUrl '{}' is stale. Either the remote peer is shutdown or the " + "network connectivity has been interrupted. Will be removed from list of remote cache peers", - rmiUrl); - staleList.add(rmiUrl); - } - } catch (Exception exception) { - LOG.error(exception.getMessage(), exception); - throw new CacheException("Unable to list remote cache peers. Error was " + exception.getMessage()); + rmiUrl); + staleList.add(rmiUrl); } - } - //Must remove entries after we have finished iterating over them - for (int i = 0; i < staleList.size(); i++) { - String rmiUrl = (String) staleList.get(i); - peerUrls.remove(rmiUrl); + } catch (Exception exception) { + throw new CacheException("Unable to list remote cache peers.", exception); } } + + // Must remove entries after we have finished iterating over them + staleList.forEach(peerUrls::remove); + return remoteCachePeers; } @@ -182,7 +173,7 @@ public final synchronized List listRemoteCachePeers(Ehcache cache) throws CacheE /** * Shutdown the heartbeat */ - public final void dispose() { + public void dispose() { heartBeatSender.dispose(); heartBeatReceiver.dispose(); } @@ -211,51 +202,42 @@ protected long getStaleTime() { * @param date the date the entry was created * @return true if stale */ - protected final boolean stale(Date date) { + protected boolean stale(Date date) { long now = System.currentTimeMillis(); return date.getTime() < (now - getStaleTime()); } + public void unregisterPeer(String rmiUrl) { + peerUrls.remove(rmiUrl); + } /** * Entry containing a looked up CachePeer and date */ - protected static final class CachePeerEntry { + private static class CachePeerEntry { private final CachePeer cachePeer; + + /** + * last access date + */ private Date date; /** - * Constructor * * @param cachePeer the cache peer part of this entry * @param date the date part of this entry */ - public CachePeerEntry(CachePeer cachePeer, Date date) { + private CachePeerEntry(CachePeer cachePeer, Date date) { this.cachePeer = cachePeer; this.date = date; } - - /** - * @return the cache peer part of this entry - */ - public final CachePeer getCachePeer() { - return cachePeer; - } - - - /** - * @return the date part of this entry - */ - public final Date getDate() { - return date; - } - } /** * @return the MulticastKeepaliveHeartbeatReceiver */ + @SuppressWarnings("unused") public MulticastKeepaliveHeartbeatReceiver getHeartBeatReceiver() { return heartBeatReceiver; } diff --git a/ehcache-core/src/main/java/net/sf/ehcache/distribution/RMICacheManagerPeerProvider.java b/ehcache-core/src/main/java/net/sf/ehcache/distribution/RMICacheManagerPeerProvider.java index c362fdcfd5..35e14c1bcb 100644 --- a/ehcache-core/src/main/java/net/sf/ehcache/distribution/RMICacheManagerPeerProvider.java +++ b/ehcache-core/src/main/java/net/sf/ehcache/distribution/RMICacheManagerPeerProvider.java @@ -16,21 +16,14 @@ package net.sf.ehcache.distribution; -import net.sf.ehcache.CacheException; import net.sf.ehcache.CacheManager; -import net.sf.ehcache.Ehcache; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** @@ -43,11 +36,6 @@ public abstract class RMICacheManagerPeerProvider implements CacheManagerPeerPro private static final Logger LOG = LoggerFactory.getLogger(RMICacheManagerPeerProvider.class.getName()); - /** - * Contains a RMI URLs of the form: "//" + hostName + ":" + port + "/" + cacheName; - */ - protected final Map peerUrls = Collections.synchronizedMap(new HashMap()); - /** * The CacheManager this peer provider is associated with. */ @@ -55,9 +43,7 @@ public abstract class RMICacheManagerPeerProvider implements CacheManagerPeerPro /** - * Constructor - * - * @param cacheManager + * @param cacheManager The CacheManager to associate to for this provider. */ public RMICacheManagerPeerProvider(CacheManager cacheManager) { this.cacheManager = cacheManager; @@ -70,70 +56,29 @@ public RMICacheManagerPeerProvider() { //nothing to do } - - /** - * {@inheritDoc} - */ - public abstract void init(); - - - /** - * Register a new peer - * - * @param rmiUrl - */ - public abstract void registerPeer(String rmiUrl); - - - /** * Gets the cache name out of the url - * @param rmiUrl + *

+ * + * @param rmiUrl the URL of the node. * @return the cache name as it would appear in ehcache.xml */ static String extractCacheName(String rmiUrl) { return rmiUrl.substring(rmiUrl.lastIndexOf('/') + 1); } - /** - * Unregisters a peer - * - * @param rmiUrl - */ - public final synchronized void unregisterPeer(String rmiUrl) { - peerUrls.remove(rmiUrl); - } - - /** - * @return a list of {@link net.sf.ehcache.distribution.CachePeer} peers for the given cache, excluding the local peer. - */ - public abstract List listRemoteCachePeers(Ehcache cache) throws CacheException; - - /** - * Whether the entry should be considered stale. This will depend on the type of RMICacheManagerPeerProvider. - *

- * @param date the date the entry was created - * @return true if stale - */ - protected abstract boolean stale(Date date); - - /** * The use of one-time registry creation and Naming.rebind should mean we can create as many listeneres as we like. * They will simply replace the ones that were there. */ public CachePeer lookupRemoteCachePeer(String url) throws MalformedURLException, NotBoundException, RemoteException { LOG.debug("Lookup URL {}", url); - CachePeer cachePeer = (CachePeer) Naming.lookup(url); - return cachePeer; + + return (CachePeer) Naming.lookup(url); } - /** - * Providers may be doing all sorts of exotic things and need to be able to clean up on dispose. - * - * @throws net.sf.ehcache.CacheException - */ - public void dispose() throws CacheException { + @Override + public void dispose() { //nothing to do. } @@ -150,8 +95,9 @@ public final CacheManager getCacheManager() { * the provider for its scheme type during replication. Similarly a BootstrapCacheLoader * should also look up the provider for its scheme. *

- * @since 1.6 introduced to permit multiple distribution schemes to be used in the same CacheManager + * * @return the well-known scheme name, which is determined by the replication provider author. + * @since 1.6 introduced to permit multiple distribution schemes to be used in the same CacheManager */ public String getScheme() { return "RMI";