3

我正在尝试使用 JBoss 7 Infinispan 缓存作为两个基于 spring 部署的战争应用程序的通信形式(稍后会更多)。我在访问 JBoss 托管缓存管理器时遇到问题。

当我使用

DefaultCacheManager cacheManager = new DefaultCacheManager();
cache = cacheManager.getCache();

在两个应用程序中的每一个上,我都有两个单独的缓存。有什么方法可以访问 JBoss 服务器创建的缓存而不使用 @ManagedBean 注释和 Java EE 标准?


完成。感谢 Kazaag,我使用了 JNDI。

JndiTemplate jndiTemplate = new JndiTemplate();
jndiTemplate.lookup("java:jboss/infinispan/container/cluster");

我有一个 DefaultEmbeddedCacheManager 类强制转换异常的众所周知的问题。我使用了反射。

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>

尽管有不同的类加载器,但缓存会被复制。

4

2 回答 2

2

如果每个应用程序都使用自己的缓存管理器,它们将被单独缓存。

您可以通过 Spring 的 JNDI 支持检索应用服务器管理的缓存容器(JNDI 名称为java:jboss/infinispan/my-container-name)。因此 Spring 将负责确保每个部分都使用相同的容器。

我不是 100% 肯定你会得到相同的缓存,它可能会返回一个特定于应用程序的缓存(这 2 个应用程序数据对象实际上来自不同的类加载器)。

嵌入式缓存可能并不意味着应用程序间的通信。您可能需要使用客户端/服务器范例。

于 2012-10-13T11:16:38.077 回答
0

有点晚了,但是可以在此处找到有关通过 JNDI 访问 infinispance 缓存存储的信息

通过 JNDI 查找,我得到了 CacheContainer

<jee:jndi-lookup id="cache1" 
    jndi-name="java:jboss/infinispan/container/jbossas7-quickstart" 
    cache="true" resource-ref="false" lookup-on-startup="true" />

我通过二传手注入

public void setContainer(CacheContainer container) {
    this.container = container;
}

现在我可以访问缓存存储了。注意这里的建议

@Resource(lookup="java:jboss/infinispan/container/my-container-name")
@Resource(lookup="java:jboss/infinispan/cache/my-container-name/my-cache-name")

不要在我的 Spring Bean 中工作

于 2013-02-21T11:27:55.143 回答