1

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

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

我正在 Glassfish 3.1.1 中部署该应用程序。我检查了 Weld jar 版本,即 Module : 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 功能。

我会很感激你的帮助...

谢谢...拉吉小号

4

1 回答 1

1

您的greet方法是在 CDI bean 中还是在 EJB 中,对吗?

JCache 注解中定义的缓存在 Infinispan CDI 提供的缓存管理器中查找。此缓存管理器包含配置了 CDI 的缓存(有关更多信息,请参阅https://docs.jboss.org/author/display/ISPN/CDI+Support)。在您的示例中,测试缓存配置将无效。

另一件事,如果您的cacheTestgreet方法在同一个类中,则无法拦截greet方法。如果不是这种情况,那么您可能会遇到GLASSFISH-17184

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

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

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

顺便说一句,您可以在此处查看Infinispan CDI 快速入门中的代码示例。

希望这有帮助!

于 2011-11-02T13:56:27.393 回答