0

问题背景:

我们正在对使用 ehcache 进行缓存的第 3 方应用程序进行升级。我们计划在生产中集群化四台服务器。

供应商提供了默认的 ehcache 配置以通过 rmi 进行集群,使用多播来发现对等点。

问题是我们的网络在短期内不支持多播,所以我们不得不覆盖默认配置来手动指定对等点。由于预算限制,使用兵马俑是不可能的。

由于这是一个升级项目,在上线之前我将无法真正测试手动配置的结果。手动配置字符多,手动编写,有出错的风险。

我的问题

有没有开源的jsp或者类似的东西可以用来将缓存集群信息显示到屏幕上。我们可以将其合并到第 3 方应用程序中,并使用它来快速验证是否正确发现了对等方。

我所调查的

我用谷歌搜索 ehache,但我的过滤技能未能将结果缩小到任何有用的范围内。

我已经研究过使用日志来跟踪缓存发生的时间,但我对这种方法并不是 100% 满意。

无法找到预先构建的解决方案将需要我自己编写。

4

4 回答 4

1

关于兵马俑和预算限制 - 还有一个免费的开源版本:参见http://terracotta.org/downloads/open-source/catalog

只要您想使用堆外内存、分布式搜索或水平扩展,就需要商业许可证,但由于您的用例似乎只涉及节点之间的基本同步,因此开源版本就足够了。

让 terracotta 服务器同步您的缓存意味着更少的网络开销和改进的一致性保证(这不是使用对等复制提供的)。

于 2012-11-27T13:12:37.443 回答
1

可以使用Ehcache 监控工具来提供缓存统计信息。一些参考资料

于 2013-08-20T09:46:38.763 回答
0

有一个 MBean 可用于在运行时监控 ehcache:

http://ehcache.org/documentation/user-guide/jmx

于 2012-11-26T23:34:06.477 回答
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>
于 2012-11-27T03:54:59.340 回答