我正在尝试将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
答案 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中看到代码示例。
希望这有帮助!