3

JBoss 7 Infinispan キャッシュを、war デプロイされた 2 つの Spring ベースのアプリの通信形式 (後で) として使用しようとしています。JBoss マネージド キャッシュ マネージャーへのアクセスに問題があります。

私が使うとき

DefaultCacheManager cacheManager = new DefaultCacheManager();
cache = cacheManager.getCache();

2 つのアプリケーションのそれぞれで、2 つの個別のキャッシュを取得します。@ManagedBean アノテーションと Java EE 標準をまったく使用せずに、JBoss サーバーによって作成されたキャッシュにアクセスする方法はありますか?


終わった。Kazaag のおかげで、JNDI を使用できました。

JndiTemplate jndiTemplate = new JndiTemplate();
jndiTemplate.lookup("java:jboss/infinispan/container/cluster");

DefaultEmbeddedCacheManager Class Cast Exception に関するよく知られた問題がありました。反射を利用しました。

Map<Object, Object> cache;
JndiTemplate jndiTemplate = new JndiTemplate();
Object cacheManager;
try {
    cacheManager = (Object) jndiTemplate.lookup("java:jboss/infinispan/container/cluster");
    Method method = cacheManager.getClass().getMethod("getCache");
    cache = (Map) method.invoke(cacheManager);
} catch (Exception e) {
    e.printStackTrace();
    return;
}

さらに、熱心に開始されたコンテナをマークする必要がありました。

    <cache-container name="cluster" aliases="ha-partition" default-cache="default">
        <transport lock-timeout="60000"/>
        <replicated-cache name="default" mode="SYNC" start="EAGER" batching="true">
            <locking isolation="REPEATABLE_READ"/>
        </replicated-cache>
    </cache-container>

クラス・ローダーは異なりますが、キャッシュは複製されます。

4

2 に答える 2

2

各アプリケーションが独自のキャッシュ マネージャーを使用している場合、それらは個別にキャッシュされます。

Spring の JNDI サポート (JNDI 名はjava:jboss/infinispan/my-container-name) を介して、アプリケーション サーバーが管理するキャッシュ コンテナーを取得できます。したがって、Spring は、すべてのパーツが同じコンテナーを使用していることを確認する責任があります。

同じキャッシュが得られるとは 100% 確信が持てません。アプリケーション固有のキャッシュが返される可能性があります (2 つのアプリケーション データ オブジェクトは、実際には異なるクラス ローダーから来ています)。

組み込みキャッシュは、おそらくアプリケーション間通信には適していません。おそらく、クライアント/サーバー パラダイムを使用する必要があります。

于 2012-10-13T11:16:38.077 に答える
0

少し遅くなりましたが、JNDI 経由でインフィニスパン キャッシュ ストアにアクセスする方法については、こちらを参照してください。

そのJNDIルックアップで、CacheContainerを取得します

<jee:jndi-lookup id="cache1" 
    jndi-name="java:jboss/infinispan/container/jbossas7-quickstart" 
    cache="true" resource-ref="false" lookup-on-startup="true" />

セッターを介して注入する

public void setContainer(CacheContainer container) {
    this.container = container;
}

これで、キャッシュストアにアクセスできるようになりました。ここでの提案に注意してください

@Resource(lookup="java:jboss/infinispan/container/my-container-name")
@Resource(lookup="java:jboss/infinispan/cache/my-container-name/my-cache-name")

Spring Bean 内で動作しない

于 2013-02-21T11:27:55.143 に答える