【问题标题】:Annotation JCacheResult is not working in Infinispan and Glassfish 3.1.1注释 JCacheResult 在 Infinispan 和 Glassfish 3.1.1 中不起作用
【发布时间】:2011-12-19 00:43:20
【问题描述】:

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

我已将 Infinispan 5.0.1 CDI 和 Core 包添加到 Maven pom。 在 beans.xml 中添加了 Infinispan 拦截器,并能够使用 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 功能。

感谢您的帮助...

谢谢... 拉杰斯

【问题讨论】:

    标签: infinispan


    【解决方案1】:

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

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

    另外,如果您的 cacheTestgreet 方法在同一个类中,则 greet 方法不能被拦截。如果不是这种情况,您可能正在点击GLASSFISH-17184

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

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

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

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

    希望对您有所帮助!

    【讨论】:

    • 感谢您的回复。是的,我只在 EJB 中创建 Jcache。我已经删除了 Injected 字段的静态,并抱怨以下错误 - 严重:加载应用程序时出现异常:WELD-001408 带有限定符 [@Default] 的类型 [DefaultCacheManager] 的不满足依赖项] 在注入点 [[field] @Inject private com.xxxx.xxxxx.xxx.CustomerFacade.defaultCacheManager] 和缓存拦截器 - 我已将 Infinispan jar 打包到 EAr 中并部署。仍然没有调用我的拦截器...
    • 为了测试,您可以尝试在您的 EJB 项目中解压 infinispan cdi 类吗? (不要忘记添加 META-INF/services 文件夹和 beans.xml)。扩展程序似乎未激活。
    • 我在部署时遇到了同样的异常 - Weld -001408 Unsatisfied dependencies for Cache
    • 我在 CDI 示例中收到以下错误 接口 code org.infinispan.cdi.Infinispan 不存在通用 bean 定义,但通用生产者可以:[方法] @GreetingCache @Infinispan @生成公共 org.infinispan.quickstart.cdi.config.Config.greetingCache()。我已将来自 Infinispan 的核心和 cdi 包保留给服务器。当我尝试部署代码时出现上述错误。你能给我一些想法吗..abou 这有什么问题...
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 2013-08-21
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多