Интеграция Spring, Infinispan и JBoss 7

Я пытаюсь использовать кеш 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>

Кэш реплицируется, хотя загрузчики разных классов.


person T.Dabrowski    schedule 12.10.2012    source источник
comment
У меня есть проблема с DefaultEmbeddedCacheManager Class Cast Exception, хорошо известной вам, которую вы решили. Но я не могу понять, почему вы определяете экземпляр кэша как Map<Object, Object> cache; редкий, чем CacheContainer ?   -  person Anton Dozortsev    schedule 20.12.2015


Ответы (2)


Если каждое приложение использует собственный диспетчер кеша, они будут иметь отдельный кеш.

Вы можете получить контейнер кеша, управляемый сервером приложений, через поддержку JNDI в Spring (имя JNDI — java:jboss/infinispan/my-container-name). Таким образом, Spring будет нести ответственность за то, чтобы каждая часть использовала один и тот же контейнер.

Я не на 100% уверен, что вы получите один и тот же кеш, он может вернуть вам кеш для конкретного приложения (объект данных 2 приложений на самом деле поступает из другого загрузчика классов).

Встроенный кеш, вероятно, не предназначен для взаимодействия между приложениями. Вероятно, вам нужно использовать парадигму клиент/сервер.

person Kazaag    schedule 13.10.2012

Немного запоздало, но информацию о доступе к хранилищу кэша infinispance через JNDI можно найти здесь

С этим поиском 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

person Stelios Koussouris    schedule 21.02.2013