我正在尝试将JBoss 7 Infinispan缓存用作两个基于战争的基于Spring的应用程序的通信形式(稍后再介绍)。我在访问JBoss托管缓存管理器时遇到问题。
当我使用
DefaultCacheManager cacheManager = new DefaultCacheManager();
cache = cacheManager.getCache();
在两个应用程序的每一个上,我都有两个单独的缓存。有没有办法完全不使用@ManagedBean批注和Java EE标准来访问JBoss服务器创建的缓存?
完成。感谢Kazaag,我使用了JNDI。
JndiTemplate jndiTemplate = new JndiTemplate();
jndiTemplate.lookup("java:jboss/infinispan/container/cluster");
我有一个与DefaultEmbeddedCacheManager Class Cast Exception有关的众所周知的问题。我用了反射。
Map<Object, Object> cache;
JndiTemplate jndiTemplate = new JndiTemplate();
Object cacheManager;
try {
cacheManager = (Object) jndiTemplate.lookup("java:jboss/infinispan/container/cluster");
Method method = cacheManager.getClass().getMethod("getCache");
cache = (Map) method.invoke(cacheManager);
} catch (Exception e) {
e.printStackTrace();
return;
}
此外,我不得不将容器标记为急切的开始。
<cache-container name="cluster" aliases="ha-partition" default-cache="default">
<transport lock-timeout="60000"/>
<replicated-cache name="default" mode="SYNC" start="EAGER" batching="true">
<locking isolation="REPEATABLE_READ"/>
</replicated-cache>
</cache-container>
尽管类加载器不同,但缓存已复制。
最佳答案
如果每个应用程序都使用自己的缓存管理器,则它们将被分开缓存。
您可以通过Spring的JNDI支持检索由应用程序服务器管理的缓存容器(JNDI名称为java:jboss/infinispan/my-container-name
)。因此,Spring将负责确保每个部件都使用相同的容器。
我不确定100%是否会获得相同的缓存,它可能会返回给您特定于应用程序的缓存(这两个应用程序数据对象实际上来自不同的类加载器)。
嵌入式缓存可能并不意味着应用程序间进行通信。您可能需要使用客户端/服务器范例。
关于spring - Spring,Infinispan和JBoss 7集成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12858624/