📄 cachefactory.java
字号:
* @param lifetime the maximum cache entry lifetime.
*/
public static void setMaxLifetimeProperty(String cacheName, long lifetime) {
cacheName = cacheName.replaceAll(" ", "");
JiveGlobals.setProperty(("cache." + cacheName + ".maxLifetime"), Long.toString(lifetime));
}
public static boolean hasMaxLifetimeFromProperty(String cacheName) {
return hasCacheProperty(cacheName, ".maxLifetime");
}
public static void setCacheTypeProperty(String cacheName, String type) {
cacheName = cacheName.replaceAll(" ", "");
JiveGlobals.setProperty("cache." + cacheName + ".type", type);
}
public static String getCacheTypeProperty(String cacheName) {
cacheName = cacheName.replaceAll(" ", "");
return JiveGlobals.getProperty("cache." + cacheName + ".type");
}
public static void setMinCacheSize(String cacheName, long size) {
cacheName = cacheName.replaceAll(" ", "");
JiveGlobals.setProperty("cache." + cacheName + ".min", Long.toString(size));
}
public static long getMinCacheSize(String cacheName) {
return getCacheProperty(cacheName, ".min", 0);
}
private static long getCacheProperty(String cacheName, String suffix, long defaultValue) {
// First check if user is overwriting default value using a system property for the cache name
String propName = "cache." + cacheName.replaceAll(" ", "") + suffix;
String sizeProp = JiveGlobals.getProperty(propName);
if (sizeProp == null && cacheNames.containsKey(cacheName)) {
// No system property was found for the cache name so try now with short name
propName = "cache." + cacheNames.get(cacheName) + suffix;
sizeProp = JiveGlobals.getProperty(propName);
}
if (sizeProp != null) {
try {
return Long.parseLong(sizeProp);
}
catch (NumberFormatException nfe) {
Log.warn("Unable to parse " + propName + " using default value.");
}
}
// Check if there is a default size value for this cache
Long defaultSize = cacheProps.get(propName);
return defaultSize == null ? defaultValue : defaultSize;
}
private static boolean hasCacheProperty(String cacheName, String suffix) {
// First check if user is overwriting default value using a system property for the cache name
String propName = "cache." + cacheName.replaceAll(" ", "") + suffix;
String sizeProp = JiveGlobals.getProperty(propName);
if (sizeProp == null && cacheNames.containsKey(cacheName)) {
// No system property was found for the cache name so try now with short name
propName = "cache." + cacheNames.get(cacheName) + suffix;
sizeProp = JiveGlobals.getProperty(propName);
}
if (sizeProp != null) {
try {
Long.parseLong(sizeProp);
return true;
}
catch (NumberFormatException nfe) {
Log.warn("Unable to parse " + propName + " using default value.");
}
}
return false;
}
/**
* Returns an array of all caches in the system.
* @return an array of all caches in the system.
*/
public static Cache[] getAllCaches() {
List<Cache> values = new ArrayList<Cache>();
for (Cache cache : caches.values()) {
values.add(cache);
}
return values.toArray(new Cache[values.size()]);
}
/**
* Returns the named cache, creating it as necessary.
*
* @param name the name of the cache to create.
* @return the named cache, creating it as necessary.
*/
@SuppressWarnings("unchecked")
public static synchronized <T extends Cache> T createCache(String name) {
T cache = (T) caches.get(name);
if (cache != null) {
return cache;
}
cache = (T) cacheFactoryStrategy.createCache(name);
return wrapCache(cache, name);
}
/**
* Destroys the cache for the cache name specified.
*
* @param name the name of the cache to destroy.
*/
public static void destroyCache(String name) {
Cache cache = caches.remove(name);
if (cache != null) {
cacheFactoryStrategy.destroyCache(cache);
}
}
/**
* Returns an existing {@link java.util.concurrent.locks.Lock} on the specified key or creates a new one
* if none was found. This operation is thread safe. Successive calls with the same key may or may not
* return the same {@link java.util.concurrent.locks.Lock}. However, different threads asking for the
* same Lock at the same time will get the same Lock object.<p>
*
* The supplied cache may or may not be used depending whether the server is running on cluster mode
* or not. When not running as part of a cluster then the lock will be unrelated to the cache and will
* only be visible in this JVM.
*
* @param key the object that defines the visibility or scope of the lock.
* @param cache the cache used for holding the lock.
* @return an existing lock on the specified key or creates a new one if none was found.
*/
public static Lock getLock(Object key, Cache cache) {
return cacheFactoryStrategy.getLock(key, cache);
}
@SuppressWarnings("unchecked")
private static <T extends Cache> T wrapCache(T cache, String name) {
cache = (T) new CacheWrapper(cache);
cache.setName(name);
caches.put(name, cache);
return cache;
}
/**
* Returns true if clustering is installed and can be used by this JVM
* to join a cluster. A false value could mean that either clustering
* support is not available or the license does not allow to have more
* than 1 cluster node.
*
* @return true if clustering is installed and can be used by
* this JVM to join a cluster.
*/
public static boolean isClusteringAvailable() {
return getMaxClusterNodes() > 1;
}
/**
* Returns true is clustering is currently being started. Once the cluster
* is started or failed to be started this value will be false.
*
* @return true is clustering is currently being started.
*/
public static boolean isClusteringStarting() {
return clusteringStarting;
}
/**
* Returns true if this node is currently a member of a cluster. The last step of application
* initialization is to join a cluster, so this method returns false during most of application startup.
*
* @return true if this node is currently a member of a cluster.
*/
public static boolean isClusteringStarted() {
return clusteringStarted;
}
/**
* Returns a byte[] that uniquely identifies this member within the cluster or <tt>null</tt>
* when not in a cluster.
*
* @return a byte[] that uniquely identifies this member within the cluster or null when not in a cluster.
*/
public static byte[] getClusterMemberID() {
return cacheFactoryStrategy.getClusterMemberID();
}
public synchronized static void clearCaches() {
for (String cacheName : caches.keySet()) {
Cache cache = caches.get(cacheName);
cache.clear();
}
}
/**
* Returns a byte[] that uniquely identifies this senior cluster member or <tt>null</tt>
* when not in a cluster.
*
* @return a byte[] that uniquely identifies this senior cluster member or null when not in a cluster.
*/
public static byte[] getSeniorClusterMemberID() {
return cacheFactoryStrategy.getSeniorClusterMemberID();
}
/**
* Returns true if this member is the senior member in the cluster. If clustering
* is not enabled, this method will also return true. This test is useful for
* tasks that should only be run on a single member in a cluster.
*
* @return true if this cluster member is the senior or if clustering is not enabled.
*/
public static boolean isSeniorClusterMember() {
return cacheFactoryStrategy.isSeniorClusterMember();
}
/**
* Returns basic information about the current members of the cluster or an empty
* collection if not running in a cluster.
*
* @return information about the current members of the cluster or an empty
* collection if not running in a cluster.
*/
public static Collection<ClusterNodeInfo> getClusterNodesInfo() {
return cacheFactoryStrategy.getClusterNodesInfo();
}
/**
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -