org.infinispan.remoting.transport.jgroups.JGroupsAddressCache Maven / Gradle / Ivy
package org.infinispan.remoting.transport.jgroups;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.jgroups.Address;
import org.jgroups.util.ExtendedUUID;
import org.jgroups.util.NameCache;
/**
* Cache JGroupsAddress instances
*
* @author Dan Berindei
* @since 7.0
*/
public class JGroupsAddressCache {
private static final ConcurrentMap addressCache =
new ConcurrentHashMap<>();
// HACK: Avoid the org.jgroups.Address reference in the signature so that local caches can work without the jgroups jar.
// Otherwise, instantiating the JGroupsAddress externalizer will try to load the org.jgroups.Address class.
public static org.infinispan.remoting.transport.Address fromJGroupsAddress(Object address) {
final Address jgAddress = (Address) address;
// New entries are rarely added added after startup, but computeIfAbsent synchronizes every time
JGroupsAddress ispnAddress = addressCache.get(jgAddress);
if (ispnAddress != null) {
return ispnAddress;
}
return addressCache.computeIfAbsent(jgAddress, uuid -> {
if (jgAddress instanceof ExtendedUUID) {
return new JGroupsTopologyAwareAddress((ExtendedUUID) jgAddress);
} else {
return new JGroupsAddress(jgAddress);
}
});
}
static void pruneAddressCache() {
// Prune the JGroups addresses & LocalUUIDs no longer in the UUID cache from the our address cache
addressCache.forEach((address, ignore) -> {
if (NameCache.get(address) == null) {
addressCache.remove(address);
}
});
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy