Как правильно использовать аннотацию @CacheResult с cache2k? - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть приложение JavaEE, и я пытаюсь использовать cache2k с jCache для кэширования результатов некоторых функций.Когда я вызываю методы, помеченные @CacheResult, ничего не происходит.Я застрял и не знаю, что не так.

Я добавил эти зависимости в свой файл pom:

       <dependency>
          <groupId>org.cache2k</groupId>
          <artifactId>cache2k-jcache</artifactId>
          <version>1.2.4.Final</version>
          <scope>runtime</scope>
        </dependency>

        <dependency>
          <groupId>org.cache2k</groupId>
      <artifactId>cache2k-api</artifactId>
      <version>1.2.4.Final</version>
        </dependency>

        <dependency>
          <groupId>javax.cache</groupId>
          <artifactId>cache-api</artifactId>
          <version>1.1.1</version>
        </dependency>

        <dependency>
            <groupId>org.jsr107.ri</groupId>
            <artifactId>cache-annotations-ri-cdi</artifactId>
            <version>1.1.1</version>
        </dependency>

Я добавил cache2k.xml в мой путь к классам.

<cache2k xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
         xmlns='https://cache2k.org/schema/v1.x'
         xsi:schemaLocation="https://cache2k.org/schema/v1.x https://cache2k.org/schema/cache2k-core-v1.x.xsd">
<!-- The configuration example for the documentation -->
  <version>1.0</version>

  <skipCheckOnStartup>false</skipCheckOnStartup>

  <defaults>
    <cache>
      <entryCapacity>1000</entryCapacity>
      <sections>
        <jcache>
          <copyAlwaysIfRequested>true</copyAlwaysIfRequested>
 <supportOnlineListenerAttachment>true</supportOnlineListenerAttachment>
        </jcache>
      </sections>
      <sharpExpiry>true</sharpExpiry>
    </cache>
  </defaults>

  <templates>
    <cache>
      <name>neverExpire</name>
      <eternal>true</eternal>
    </cache>
    <cache>
      <name>regularExpiry</name>
      <expireAfterWrite>5m</expireAfterWrite>
    </cache>
    <cache>
      <name>lessResilient</name>
      <resilienceDuration>1m</resilienceDuration>
    </cache>
  </templates>

  <caches>
    <cache>
      <name>testCache</name>
      <include>neverExpire</include>
    </cache>
  </caches>
</cache2k>

У меня есть метод производителя для вставки в кеш.Там я регистрирую прослушиватель для всех событий кэша (onCreated, onUpdated, onRemoved, onExpired) для целей отладки.

@Produces
@NamedCache
public Cache<Object, Object> getCache(InjectionPoint injectionPoint) {
        final CachingProvider cachingProvider = Caching.getCachingProvider();
        final CacheManager mgr = cachingProvider.getCacheManager();
        final NamedCache annotation = injectionPoint.getAnnotated().getAnnotation(NamedCache.class);
        final String cacheName = annotation.name();

        Cache<Object, Object> cache = mgr.getCache(cacheName);
        if (cache == null) {
            System.out.println("CACHE CREATE");
            MutableConfiguration<Object, Object> config = new MutableConfiguration<Object, Object>();
            config.setTypes(Object.class, Object.class);
            config.setStoreByValue(true);
            config.setStatisticsEnabled(false);
            config.setManagementEnabled(false);
            config.setExpiryPolicyFactory(AccessedExpiryPolicy.factoryOf(Duration.FIVE_MINUTES));

            cache = mgr.createCache(cacheName, config);
        }
        else {
            System.out.println("CACHE FOUND");
        }

        cache.registerCacheEntryListener(
                new MutableCacheEntryListenerConfiguration<Object, Object>(
                        FactoryBuilder.factoryOf(new CacheListener<Object, Object>()),
                        null,
                        false,
                        false));

    return cache;
}

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

@Inject
@NamedCache(name="testCache")
private Cache<Object, Object> testCache;

Но когда я аннотирую какой-либо метод с помощью @CacheResult, ничего не происходит.

@CacheResult(cacheName="testCache")
public Long simpleMethod(@CacheKey String key) {
    return Long.valueOf(999);
}

Результатом метода не являетсяв кеше.Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Вам необходимо зарегистрировать CacheResultInterceptor в beans.xml.Что-то вроде:

/ META-INF / beans.xml

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
    <interceptors>
        <class>org.jsr107.ri.annotations.cdi.CacheResultInterceptor</class>
    </interceptors>
</beans>
0 голосов
/ 21 сентября 2019

Из вашего кода я не на 100% уверен, что происходит.Обратите внимание, что аннотации RI не используют String в качестве ключа напрямую, а оборачивают все в другой объект.См .: EE8 JCache аннотация CacheResult не работает

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

...