зарегистрировать слушатель кэша Infispan в Wildfly - PullRequest
0 голосов
/ 06 марта 2020

У меня есть кэш бесконечности, определенный в wildfly stanadlone.xml, как показано ниже.

    <cache-container name="dummycache" default-cache="stringCache">
        <local-cache name="stringCache">
            <expiration lifespan="1800000"/>
        </local-cache>
    </cache-container>

Этот кэш инициализируется запуском бесконечности, встроенным в саму wildfly. Я мог бы искать и использовать кеш, как показано ниже.

@Resource(lookup = "java:comp/env/infinispan/stringCache")
private Cache<String, String> stringCache;  

Теперь я хотел бы добавить listeners, чтобы получать уведомления о cache expired событиях. Но вопрос в том, как мне зарегистрировать этот слушатель на infinispan cache, который полностью управляется widlfly container?

Я считаю, что мы можем addListeners() кэшировать объект, но в какой момент? В идеале я хочу, чтобы он был инициализирован, когда полевой мухи создает сам кеш. Похоже, схема infinspan-standalone не поддерживает элемент listener для установки его в конфигурации кеша. Таким образом, единственный другой способ - inject кешировать в filter или подобном и вызывать addListener() тогда?

Есть какой-нибудь изящный способ сделать это?

1 Ответ

1 голос
/ 11 марта 2020

Чтобы установить сцену - я запускаю веб-приложение на wildfly 10, которое запускается в автономном режиме. Конфигурация кеш-контейнера в автономном режиме. xml:

<cache-container name="web" default-cache="passivation" module="org.wildfly.clustering.web.infinispan">
    <local-cache name="passivation">
       <locking isolation="REPEATABLE_READ"/>
       <transaction locking="OPTIMISTIC" mode="BATCH"/>
       <file-store passivation="true" purge="false"/>
    </local-cache>
    <local-cache name="persistent">
       <locking isolation="REPEATABLE_READ"/>
       <transaction locking="OPTIMISTIC" mode="BATCH"/>
       <file-store passivation="false" purge="false"/>
   </local-cache>
</cache-container>

Вот мои изменения шаг за шагом:

  1. Зависимость от бесконечности

Я добавил

 <dependency>
	<groupId>org.infinispan</groupId>
	<artifactId>infinispan-core</artifactId>
	<version>9.2.4.Final</version>
	<scope>provided</scope>
</dependency>
web. xml

Добавить ресурс (в моем случае я пытаюсь получить ресурс для веб-контейнера кэша)

<resource-ref>
	<res-ref-name>infinispan/cacheContainer</res-ref-name>
	<lookup-name>java:jboss/infinispan/container/web</lookup-name>
</resource-ref>

Я также добавил прослушиватель контекста сервлета, потому что хочу добавить прослушиватель кэша для contextInitialized

<listener>
	<listener-class>some.package.ContextListenerCacheAddListener</listener-class>
</listener>
jboss-deploy-structure. xml

Я добавил это в мой каталог WEB-INF войны

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="org.infinispan" />
        </dependencies>
    </deployment>
</jboss-deployment-structure>

Оказывается, что если вы пропустите это - классы infinispan будут загружаться различными загрузчиками классов (насколько я понимаю)

Java код

Внедрение ресурса и использование его для добавления слушателей в кеши

public class ContextListenerCacheAddListener implements ServletContextListener {

    @Resource(name = "infinispan/cacheContainer")
    CacheContainer cacheContainer;

    static Logger logger = Logger.getLogger(ContextListenerCacheAddListener.class);

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
            cacheContainer.getCache("myapp.war").addListener(new MyListener("myapp.war"));
            cacheContainer.getCache("passivation").addListener(new MyListener("passivation"));
            cacheContainer.getCache("persistent").addListener(new MyListener("persistent"));
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }

    @Listener
    public static class MyListener{

        private String name;

        public MyListener(String name) {
            this.name = name;
        }

        @CacheEntryCreated
        public void onCreate(CacheEntryEvent event){
            logger.warn(name +" created entry "+event.getKey() );
        }

        @CacheEntryModified
        public void onModify(CacheEntryEvent event){
            logger.warn(name +" modified entry "+event.getKey());
        }

        @CacheEntryVisited
        public void onVisited(CacheEntryEvent event){
            logger.warn(name +" visited entry "+event.getKey());
        }

        @TransactionRegistered
        public void onTransactionRegistered(TransactionRegisteredEvent event){
            logger.warn(name +" registered transaction entry ");
        }

        @TransactionCompleted
        public void onTransactionCompleted(TransactionCompletedEvent event){
            logger.warn(name +" completed transaction entry ");
        }
    }
}

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

...