注释JCacheResult在Infinispan和Glassfish 3.1.1中不起作用

时间:2011-10-31 19:57:37

标签: infinispan

我正在尝试将Infinispan的JCache集成到我现有的EJB项目中。

我已将Infinispan 5.0.1 CDI和Core软件包添加到Maven pom。 在beans.xml中添加了Infinispan Interceptor,并且能够使用CacheResult注释。

我正在Glassfish 3.1.1中部署应用程序。我查了一下Weld jar版本 模块: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;
    }

调用greet()方法,但它永远不会将方法结果添加到测试缓存中。我觉得我错过了一些配置或......我不知道。请帮帮我。

当我注入类时,它们不会被构造并且它们是空的。代码是这样的,

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

@Inject
private static EmbeddedCacheManager defaultCacheManager;

这些执行没有任何错误,但它们不会被初始化。

我不知道......但是我能够轻松地在这个类中注入其他EJB。顺便说一句,我试图在其中一个EJB中添加Jcache功能。

感谢您的帮助......

...谢谢 Raj S

1 个答案:

答案 0 :(得分:1)

您的 greet 方法位于CDI bean或EJB中,对吧?

在Infinispan CDI提供的缓存管理器中查找JCache注释中定义的缓存。此缓存管理器包含使用CDI配置的缓存(有关详细信息,请参阅https://docs.jboss.org/author/display/ISPN/CDI+Support)。在您的示例中, test-cache 配置将无效。

另外,如果您的 cacheTest greet 方法属于同一个类,则无法拦截 greet 方法。如果情况并非如此,那么您可能正在点击GLASSFISH-17184

对于Cache和EmbeddedCacheManager注入,问题是您正在进行静态注入,CDI不支持。来自CDI(JSR-299)规范

  

注入字段是bean类的非静态非final字段,或支持注入的任何Java EE组件类。

如果你的方法结果没有被缓存,我认为是因为没有调用 CacheResultInterceptor 。我刚刚使用Infinispan CDI快速入门进行了测试。如果拦截器在lib中,则不会启用它们。我认为它是Glassfish中的一个错误。

顺便说一句,您可以在Infinispan CDI快速入门here中看到代码示例。

希望这有帮助!