WildFly 10, JCache - метод кеширования

У меня есть простое приложение, используя Spring Boot. Я хотел разрешить метод кэширования с JSR107 - JCache. Итак, с помощью учебника я собрал этот код:

@CacheResult(cacheName = "testpoc")
public Country getCountry(Integer id){
    System.out.println("---> Loading country with code '" + id + "'");
    return new Country(id, "X", "Title");
}

с этим файлом POM

...
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>1.4.0.RELEASE</version>
    </dependency>
    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-cache</artifactId>
         <version>1.4.0.RELEASE</version>
    </dependency>

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

(зависимость 'spring-boot-starter-web' существует для простого сервиса REST, который вызывает метод getCountry)

Все работает так, как сказано в документации - метод вызывается только один раз.

Теперь я хотел попробовать это на сервере приложений WildFly 10

Я изменил файл POM:

  • исключенный кот
  • исключен spring-boot-starter-cache
  • добавлен infinispan-jcache (потому что я хочу использовать кэш, настроенный / управляемый wildfly в standalone/domain.xml)

Проверьте файл pom здесь на pastebin.

Проблема в том, что я получаю следующую ошибку: Не удается найти кэш с именем "java:jboss/infinispan/app-cache"

(Я пытался использовать как назначенный JNDI, так и имя кэш-памяти Infispan, настроенной в wildfly).

Следующий код создал объект Cache (чтобы я мог его использовать):

CacheManager cacheManager = Caching.getCachingProvider().getCacheManager();
Cache<String, String> cache = cacheManager.createCache("testpoc", new MutableConfiguration<String, String>());

Вопрос:

  • Можно ли использовать метод кэширования JCache на WildFly 10, используя Infinispan, управляемый WildFly?
  • Или Infinispan следует использовать для кэширования методов, таких как JCache, следовательно, JCache обладает "большей функциональностью", чем Infinispan.

большое спасибо

PS: для меня не проблема поместить весь код на github и разместить ссылку - всего несколько строк кода...

1 ответ

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

Сначала вам нужно использовать правильную настройку Infinispan. Биты Infinispan, поставляемые с WF, следует рассматривать как внутренние или частные. Для правильного использования Infinispan в вашем приложении - либо добавьте org.infinispan:infinispan-embedded в ваше развертывание или установить модули Infinispan Wildfly. Вы можете найти руководство по установке здесь (оно немного устарело, но, тем не менее, процедура точно такая же - распакуйте модули в WF и используйте Dependencies MANIFEST.MF запись).

После того, как вы успешно установили Infinispan (или добавили его в свое приложение), вам необходимо решить, хотите ли вы использовать Spring Cache или JCache. Если вы заинтересованы только в использовании аннотаций - я бы порекомендовал первый, поскольку его гораздо проще настроить (все, что вам нужно сделать, это добавить @EnableCaching в одну из ваших конфигураций). Наконец, с Spring Cache вы создадите Infinispan CacheManager боб. Пример можно найти здесь.

Последнее замечание - если вам все еще нужно использовать JCache - используйте это руководство для настройки Caching Provider.

Другие вопросы по тегам