测试ehcache手动配置的集群正在运行

时间:2012-11-26 23:28:53

标签: java cluster-computing ehcache

问题背景:

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

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

问题是我们的网络在短期内不支持组播,因此我们不得不覆盖默认配置以手动指定对等体。由于预算限制,使用赤土陶器是不可能的。

由于这是一个升级项目,因此在上线之前我无法真正测试手动配置的结果。手动配置是多个字符长,手动编写,因此存在可能存在错误的风险。

我的问题

是否有可用于向屏幕显示缓存群集信息的开源jsp或类似内容。我们可以将其合并到第三方应用程序中,并使用它来快速验证对等方是否被正确发现。

我调查的内容

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

我已经看过使用日志来跟踪缓存何时发生,并且对这种方法并不是100%满意。

未能找到预先构建的解决方案需要我自己编写。

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

Ehcache monitoring tool可用于提供缓存统计信息。一些references

答案 2 :(得分:0)

您可以使用MBean在运行时监视ehcache:

请参阅http://ehcache.org/documentation/user-guide/jmx

答案 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>