Как правильно использовать аннотацию @CacheResult с cache2k
У меня есть приложение 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 ответа
Из вашего кода я не уверен на 100%, что происходит. Учтите, что аннотации RI не используютString
как ключ напрямую, но оборачивает все в другой объект. Смотрите: аннотация EE8 JCache CacheResult не работает
Если эта подсказка не помогает, укажите, как вы проверяете содержимое кеша, или добавьте пример вывода.
Вам необходимо зарегистрировать 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>