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

ここで詳細に入ります。元の InfinispanModule を見ると、モジュールの作成時に CacheManager を渡すか、何らかの方法でモジュール内に 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 に答える