Аннотация JCacheResult не работает в Infinispan и Glassfish 3.1.1 - PullRequest
1 голос
/ 31 октября 2011

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

Я добавил пакеты Infinispan 5.0.1 CDI и Core в Maven pom.Добавлены Infinispan Interceptors в beans.xml и возможность использовать аннотацию CacheResult.

Я развертываю приложение в Glassfish 3.1.1.Я проверил версию JAR-файла Weld, которая является Module: org.jboss.weld.osgi-bundle: 1.1.1.Final

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

Мой код выглядит следующим образом, вызывается метод

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;
    }

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

Когда я внедряю классы, они не будут построены, и они будут нулевыми.Код выглядит следующим образом:

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

@Inject
private static EmbeddedCacheManager defaultCacheManager;

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

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

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

Спасибо ... Raj S

1 Ответ

1 голос
/ 02 ноября 2011

Ваш привет метод используется в компоненте 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. Если перехватчики находятся в lib, они не включены. Я думаю, что это ошибка в Glassfisч.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...