2

我已经看到了各种各样的点点滴滴,但我要么接近这个错误,要么对 Guice 的理解有点不足。我正在尝试修改/扩展这个cache4guice Infinispan 模块 ,以便它可以访问 JBoss 嵌入式模块,并最终在选定的缓存容器中命名缓存。

因此,我们的standalone.xml 包含以下内容:

<cache-container name="InfinispanCacheModule" default-cache="cache1" jndi-name="java:jboss/infinispan/container/mycachecontainer>
<local-cache name="cache1">
    <eviction strategy="LRU" max-entries="1000"/>
    <expiration max-idle="50000"/>
    <file-store preload="true" passivation="true" purge="false"/>
</local-cache>
<local-cache name="cache2">
    <eviction strategy="LRU" max-entries="500"/>
    <expiration max-idle="20000"/>
    <file-store preload="true" passivation="false" purge="false"/>
</local-cache>

我已经修改了 @Cached 注释以允许可选地包含一个 cachedName 参数。您可以将其用于默认缓存的想法:

@Cached
public someMethod(String someArg) {...}

这用于访问 cache2 及以上...

@Cached(cacheName="cache2")
public someOtherMethod(String someArg) {...}

我发现似乎允许我访问事物的唯一示例是使用 jndi 资源,例如在此页面中 - ttp://my.safaribooksonline.com/book/web-development/ 9781590599976/guice-recipes/integrating_jndi

这导致我尝试这样的事情:

public class InfinispanCacheModule extends CacheModule {
...
    @Override
    protected void configure() {
        // bind naming context to the default InitialContext
        bind(Context.class).to(InitialContext.class);

        bind(CacheContainer.class).toProvider(JndiIntegration.fromJndi(CacheContainer.class, "java:jboss/infinispan/container/mycachecontainer"));

        bindInterceptor(Matchers.any(), Matchers.annotatedWith(Cached.class), new CacheInterceptor(this));        
    }

此外,从这里和其他地方的帖子来看,我似乎可能想使用@Provides 方法——沿着这些思路: https ://stackoverflow.com/a/8999548/880884 Guice:是否可以注入模块?

所以,现在我们进入细节,如果我们看一下原始的 InfinispanModule,我的想法是在模块创建时传入一个 CacheManager,或者以某种方式在模块内创建一个。

public class MyGuiceFactory {
private static final Injector inj = Guice.createInjector(
new SomeGuiceModule(), 
new InfinispanCacheModule(---- what goes here? -----)
);
public static Injector getInjector() {
    return inj;
}
}

类似问题: Spring、Infinispan 和 JBoss 7 集成

4

1 回答 1

1

为了让它工作,我只使用了正常的上下文和查找。我将以下方法放在我的 Guice Factory 中,然后通过新的构造函数将 CacheContainer 传递给 InfinispanCacheModule。

public static CacheContainer getCacheContainer() {
    org.infinispan.manager.CacheContainer container = null;
    try {
        Context ctx = new InitialContext();
        container = (CacheContainer) ctx
                .lookup("java:jboss/infinispan/container/mycache");
    } catch (NamingException e) {
        e.getCause();
    }
    return container;
}

从那里我可以在 Injector 中使用“cacheName”注释参数,然后返回到 InfinispanCacheModule 的 getCache(String cacheName) 方法。如果您希望我分享更多代码,请回复此线程,我将发布更多详细信息。

于 2013-03-08T22:13:17.840 回答