Аннотация JCacheResult не работает в Infinispan и Glassfish 3.1.1

Я пытаюсь интегрировать JCache от Infinispan в свой существующий проект EJB.

Я добавил пакеты Infinispan 5.0.1 CDI и Core в Maven pom. В файл beans.xml добавлены перехватчики Infinispan, которые могут использовать аннотацию CacheResult.

Я развертываю приложение в Glassfish 3.1.1. Я проверил версию jar Weld, которая представляет собой модуль: org.jboss.weld.osgi-bundle:1.1.1.Final.

Во время выполнения перехватчик метода CacheResult не кэширует результат метода и всегда вызывается.

Мой код выглядит так,

public void cacheTest() {
        Thread.currentThread().setContextClassLoader(
                this.getClass().getClassLoader());
        EmbeddedCacheManager manager = createCacheConfig();

        Set<String> cacheList = manager.getCacheNames(); // new
                                                            // DefaultCacheManager().getCacheNames();

        for (String cache : cacheList) {
            System.out.println("Cache name " + cache);
        }
        defaultCache = manager.getCache("test-cache");

        defaultCache.put("aa", "AA");
        String user = "User";

        greet(user);
        Set<String> keys = defaultCache.keySet();
        for (String key : keys) {
            System.out.println("Key is -" + key + "Value is -"
                    + defaultCache.get(key));
        } 

    }

    @CacheResult(cacheName = "test-cache")
    public String greet(@CacheKeyParam String user) {
        user += "Hello";
        return user;
    }

    public EmbeddedCacheManager createCacheConfig() {
        EmbeddedCacheManager manager = new DefaultCacheManager();
        Configuration conf = new Configuration();
        conf.fluent().eviction().strategy(EvictionStrategy.FIFO).maxEntries(10)
                .expiration().maxIdle(1200000L).build();
        conf.fluent().clustering().sync();
         manager.start();
        manager.defineConfiguration("test-cache", conf);
        return manager;
    }

Метод приветствия() вызывается, но он никогда не добавит результат метода в тестовый кеш. Я чувствую, что мне не хватает какой-то конфигурации или... я не знаю. Пожалуйста помоги мне с этим.

когда я ввожу классы, они не будут построены и будут нулевыми. Код такой,

    @Inject
private static org.infinispan.Cache<String, String> defaultCache;

@Inject
private static EmbeddedCacheManager defaultCacheManager;

Они выполняются без ошибок, но не инициализируются.

Я понятия не имею... Но я могу легко внедрить другие EJB в этот класс. Кстати, я пытаюсь добавить функциональность Jcache в один из EJB.

Буду признателен за вашу помощь...

Спасибо... Радж С.


person Raj S    schedule 31.10.2011    source источник


Ответы (1)


Ваш метод greet находится в компоненте CDI или в EJB, верно?

Кэш, определенный в аннотациях JCache, просматривается в диспетчере кэшей, предоставляемом Infinispan CDI. Этот диспетчер кеша содержит кеш, настроенный с помощью CDI (для получения дополнительной информации см. https://docs.jboss.org/author/display/ISPN/CDI+Support). В вашем примере конфигурация test-cache не будет работать.

Другое дело, если ваши методы cacheTest и greet находятся в одном классе, метод greet не может быть перехвачен. Если это не так, возможно, вы нажимаете GLASSFISH-17184.

Для инъекций Cache и EmbeddedCacheManager проблема заключается в том, что вы делаете статическую инъекцию, не поддерживаемую CDI. Из спецификации CDI (JSR-299)

Внедряемое поле — это нестатическое, не конечное поле класса компонента или любого класса компонентов Java EE, поддерживающего внедрение.

Если результат вашего метода не кэшируется, я думаю, это потому, что не вызывается CacheResultInterceptor. Я только что сделал тест с помощью быстрого запуска Infinispan CDI. Если перехватчики находятся в библиотеке, они не включены. Я думаю, что это ошибка в Glassfish.

Кстати, вы можете увидеть пример кода в кратком руководстве Infinispan CDI здесь .

Надеюсь, это поможет!

person kevinpollet    schedule 02.11.2011
comment
Спасибо за ответ. Да, я создаю Jcache только в EJB. Я удалил статическую информацию для поля Injected и жалуется на следующую ошибку: СЕРЬЕЗНАЯ: Исключение при загрузке приложения: WELD-001408 Неудовлетворенные зависимости для типа [DefaultCacheManager] с квалификаторами [@Default ] в точке внедрения [[поле] @Inject private com.xxxx.xxxxx.xxx.CustomerFacade.defaultCacheManager] И перехватчики кеша — я упаковал JAR-файлы Infinispan в EAr и развернул. До сих пор мои перехватчики не вызываются... - person Raj S; 02.11.2011
comment
Можете ли вы для теста распаковать классы infinispan cdi внутри своего EJB-проекта? (не забудьте добавить папку META-INF/services и beans.xml). Похоже, что расширение не активно. - person kevinpollet; 03.11.2011
comment
Я получаю то же исключение, что и при развертывании: Weld -001408 Неудовлетворенные зависимости для кеша. - person Raj S; 03.11.2011
comment
Я получаю следующую ошибку для примера CDI. Для интерфейса code org.infinispan.cdi.Infinispan не существует определения универсального компонента, но существует универсальный производитель: [метод] @GreetingCache @Infinispan @Produces public org.infinispan.quickstart.cdi. config.Config.greetingCache(). Я оставил пакеты ядра и cdi от Infinispan доступными для сервера. Я получаю указанную выше ошибку, когда пытаюсь развернуть код. Не могли бы вы дать мне некоторое представление о том, что не так с этим ... - person Raj S; 04.11.2011