问题背景:
我们正在升级到使用ehcache进行缓存的第三方应用程序。我们计划在生产中集中四台服务器。
供应商已提供默认的ehcache配置以通过rmi进行群集,使用多播来发现对等方。
问题是我们的网络在短期内不支持组播,因此我们不得不覆盖默认配置以手动指定对等体。由于预算限制,使用赤土陶器是不可能的。
由于这是一个升级项目,因此在上线之前我无法真正测试手动配置的结果。手动配置是多个字符长,手动编写,因此存在可能存在错误的风险。
我的问题
是否有可用于向屏幕显示缓存群集信息的开源jsp或类似内容。我们可以将其合并到第三方应用程序中,并使用它来快速验证对等方是否被正确发现。
我调查的内容
我已经使用谷歌搜索ehache,但我的过滤技巧未能将结果缩小到任何有用的范围。
我已经看过使用日志来跟踪缓存何时发生,并且对这种方法并不是100%满意。
未能找到预先构建的解决方案需要我自己编写。
答案 0 :(得分:1)
关于兵马俑和预算限制 - 还有一个免费的开源版本: 见http://terracotta.org/downloads/open-source/catalog
只要您想使用offheap内存,分布式搜索或水平扩展,就需要商业许可证,但由于您的用例似乎只涉及节点之间的基本同步,因此开源版本就足够了。
让terracotta服务器同步您的缓存意味着更少的网络开销和更高的一致性保证(使用对等复制不会提供)。
答案 1 :(得分:1)
Ehcache monitoring tool可用于提供缓存统计信息。一些references。
答案 2 :(得分:0)
您可以使用MBean在运行时监视ehcache:
答案 3 :(得分:0)
我必须自己写这个。如果其他人需要,这是代码。
@Controller
@RequestMapping(value = "/tools/ehcache")
public class EhcacheManagerController {
private static final String VIEW_URL = "/WEB-INF/views/tools/ehcache/ehcache.jsp";
private static final String ALL = "all";
List<CacheManager> allCacheManagers = CacheManager.ALL_CACHE_MANAGERS;
private static final Log logger = LogFactory.getLog(EhcacheManagerController.class);
@RequestMapping(method = RequestMethod.GET)
protected String loadPage(ModelMap modelMap) throws Exception {
// Manager (keyed by name) --> Cache (keyed by name) --> Peer Information (keyed by peer Name)
Map<String,Map<String,Map<String,String>>> managerMap = new HashMap<String,Map<String,Map<String,String>>>();
for (CacheManager cacheManager : allCacheManagers) {
Map<String,Map<String,String>> cacheMap = new HashMap<String,Map<String,String>>();
managerMap.put(cacheManager.getName(), cacheMap);
String[] cacheNames = cacheManager.getCacheNames();
for (String name : cacheNames) {
Map<String,String> peerInfoMap = new HashMap<String,String>();
cacheMap.put(name,peerInfoMap);
CacheManagerPeerProvider provider = cacheManager.getCacheManagerPeerProvider("RMI");
if (provider == null) {
peerInfoMap.put("nopeer","no status");
break;
}
Cache ehcache = cacheManager.getCache(name);
List<CachePeer> cachePeers = provider.listRemoteCachePeers(ehcache);
for (CachePeer cachePeer : cachePeers) {
StringBuilder cacheStatus = new StringBuilder();
String peerName = cachePeer.getName();
cacheStatus.append("url='").append(cachePeer.getUrl()).append("' ");
cacheStatus.append("keyssize='").append(cachePeer.getKeys().size()).append("' ");
peerInfoMap.put(peerName,cacheStatus.toString());
}
}
}
modelMap.put("managerMap", managerMap);
return VIEW_URL;
}
}
jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>EHCache</title>
</head>
<body>
<h1>EHCache</h1>
<p><a href="/tools/ehcache/clear?name=all">Clear All</a></p>
<c:forEach items="${managerMap}" var="manager">
<h2>Manager: '${manager.key}'</h2>
<c:forEach var="cacheMap" items="${manager.value}">
<h3>Cache: '${cacheMap.key}'</h3>
<p><a href="/tools/ehcache/clear?cacheManagerName=${manager.key}&cacheName=${cacheMap.key}">clear</a></p>
<c:forEach var="peerInfoMap" items="${cacheMap.value}">
<li>peer name = ${peerInfoMap.key} peer status = ${peerInfoMap.value}</li>
</c:forEach>
</c:forEach>
</c:forEach>
</body>
</html>