Почему я не могу получить кэши, которые я добавил в конфигурации wildfly? - PullRequest
0 голосов
/ 20 мая 2019

У меня есть 2 автономных wildfly 13 в кластере и приложение EE, развернутое на обоих узлах.

У меня есть кешируемая сущность (@Cache из hibernate и @Cacheable из jpa), а также именованный запрос с использованием кеша.

Я хочу, чтобы именованный кэш запросов проходил аннулирование при обновлении сущности.

Когда я запускаю приложение, предоставленный кеш с именем «entity» работает должным образом: он делает недействительным весь кластер при обновлении объекта (он имеет тип invalidation_sync согласно jmx).

Проблема с моим пользовательским кешем: он не запускается во время развертывания, а когда он запускается, это локальный кеш. При обновлении сущности недействительность не происходит.

Я попытался найти свой пользовательский кеш с помощью @Startup ejb безуспешно (кеш не найден) или, что удивительно, я получил NoClassDefFoundError на org.infinispan.Cache.

Предложения от https://developer.jboss.org/thread/276133 и https://developer.jboss.org/thread/277425?start=15&tstart=0 не помогают.

Пользовательский кеш, который я добавил в конфигурации wildfly, не запускается: я не вижу его в jmx и не могу получить его с помощью поиска jndi, предложенного Полом Ферраро здесь по шаблону имени jndi .

Вот соответствующая часть объекта:

@Entity
@Table(name = "parameter", schema = "public")
@NamedQueries({
        @NamedQuery(name = "findByValue", query = "select p from Parameter p where p.valeur = :valeur", hints = {
                @QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"),
                @QueryHint(name = org.hibernate.annotations.QueryHints.CACHE_REGION, value = "invalidation-query"),
                @QueryHint(name = QueryHints.CACHE_MODE, value = "NORMAL"),
                @QueryHint(name = QueryHints.COMMENT, value = "Parameter.findByValue")
        })
})
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "entity")

Вот часть контейнера кэша гибернации моего автономного full-ha.xml:

<cache-container name="hibernate" module="org.infinispan.hibernate-cache">
    <transport channel="omega-ee" lock-timeout="60000"/>
    <local-cache name="local-query">
        <object-memory size="10000"/>
        <expiration max-idle="100000"/>
    </local-cache>
    <invalidation-cache name="entity">
        <transaction mode="NON_XA"/>
        <object-memory size="10000"/>
        <expiration max-idle="100000"/>
    </invalidation-cache>
    <invalidation-cache name="invalidation-query">
        <transaction mode="NON_XA"/>
        <object-memory size="10000"/>
        <expiration max-idle="100000"/>
    </invalidation-cache>
    <replicated-cache name="RPL-getParamGenTest" statistics-enabled="true">
        <transaction mode="BATCH"/>
    </replicated-cache>
    <replicated-cache name="replicated-entity" statistics-enabled="true">
        <transaction mode="NONE"/>
    </replicated-cache>
</cache-container>

persistence.xml выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
          http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
             version="2.1">

    <persistence-unit name="myPersistenceUnit">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <jta-data-source>java:jboss/datasources/jdbc/myDatasource</jta-data-source>

        <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>

        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL9Dialect"/>
            <property name="hibernate.cache.use_second_level_cache" value="true"/>
            <property name="hibernate.cache.use_query_cache" value="true"/>

            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
        </properties>
    </persistence-unit>

</persistence>

Код, использованный для поиска jndi, выглядит так:

@Resource(name = "infinispan/replicated-query")
private Cache<?, ?> cache;

Чего мне не хватает?

Я использую wildfly 13, hibernate 5.1.14 и infinispan 9.2.4.

1 Ответ

0 голосов
/ 20 мая 2019

Обновите до Infinispan 9.4 и попробуйте следующее:

 <cache-container module="org.infinispan.extension:ispn-9.4" name="infinispan_container" default-cache="default">
   <transport/>
   <global-state/>
   <distributed-cache name="default"/>
   <distributed-cache name="memcachedCache"/>
   <distributed-cache name="namedCache"/>
 </cache-container>
</subsystem>
public class ExampleApplication {
    @Resource(lookup = "java:jboss/datagrid-infinispan/container/infinispan_container")
    CacheContainer container;

    @Resource(lookup = "java:jboss/datagrid-infinispan/container/infinispan_container/cache/namedCache")
    Cache cache;
}

См .: http://infinispan.org/docs/stable/user_guide/user_guide.html#accessing_containers_and_caches

...