0

こんにちは、他の ehcache レプリケーションの問題に非常に似た質問を投稿して申し訳ありませんが、私は一日中この問題に頭を悩ませており、解決策のない多くのスタックオーバーフローの投稿を読みました。

できる限り簡単な ehcache レプリケーション テストをセットアップしようとしましたが、うまくいきません。EhcacheTest は、1 つの要素を「tprc」という名前のキャッシュに書き込み、次にキャッシュを読み取り、見つかったものを出力します。EhcacheTest2 はほぼ同じですが、別の要素を書き込みます。私は、EhcacheTest2 が、EhcacheTest と EhcacheTest2 によって書き込まれた値の両方を表示することを期待しています。

EhcacheTest は次のとおりです。

public class EhcacheTest {

    public static void main(String[] args) {
        CacheManager manager = CacheManager.newInstance("bin/ehcache.xml");

        Cache cache = manager.getCache("tprc");
        Element element = new Element("name1", "jim");
        cache.put(element);

        for (int i = 1; i <= 2; i++) {
            String key = "name" + Integer.toString(i);
            Element got = cache.get(key);
            if (got != null) {
                System.out.println("1 " + got.getObjectKey() + "=" + got.getObjectValue());
            }
        }
    }
}

EhcacheTest2 は次のとおりです。

public class EhcacheTest2 {
  public static void main(String[] args) {
    CacheManager manager = CacheManager.newInstance("bin/ehcache.xml");

    Cache cache = manager.getCache("tprc");
    Element element = new Element("name2", "erik");
    cache.put(element);

    for (int i = 1; i <= 2; i++) {
      String key = "name" + Integer.toString(i);
      Element got = cache.get(key);
      if (got != null) {
        System.out.println("2 " + got.getObjectKey() + "=" + got.getObjectValue());
      }
    }
  }
}

ehcache.xml ファイルは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="ehcache.xsd"
         updateCheck="true" monitoring="autodetect"
         dynamicConfig="true">

    <cacheManagerPeerProviderFactory
            class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
            properties="peerDiscovery=automatic,
                        multicastGroupAddress=230.0.0.1,
                        multicastGroupPort=4446"/>

    <cacheManagerPeerListenerFactory
            class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
            properties="hostName=192.168.1.115, port=40001, socketTimeoutMillis=5000"/>

    <cache name="tprc"
           maxEntriesLocalHeap="10"
           eternal="false"
           timeToIdleSeconds="100"
           timeToLiveSeconds="100">
        <cacheEventListenerFactory
                class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
                properties="replicateAsynchronously=false, replicatePuts=true,
                            replicatePutsViaCopy=true, replicateUpdates=true,
                            replicateUpdatesViaCopy=true, replicateRemovals=true"/>
    </cache>
</ehcache>

EhcacheTest を実行し、実行したままにしてから、EhcacheTest2 を実行します。EhcacheTest の出力は次のとおりです。

1 name1=jim

EhcacheTest2 の出力は次のとおりです。

2 name2=erik

EhcacheTest2 の出力を表示したい

2 name1=jim
2 name2=erik

誰が何が悪いのか知っていますか?

4

1 に答える 1

2

わかりました。上記のコードは機能しましたが、キャッシュの内容を出力する前にキャッシュが同期するのに十分な時間待機しませんでした。キャッシュ チェックの周りに while ループを追加し、ループを数回繰り返した後、各テスト プログラムが他のプログラムのキャッシュ要素を表示し始めました。ループを含むテスト プログラムは次のとおりです。

  public static void main(String[] args) throws InterruptedException {   
    CacheManager manager = CacheManager.newInstance("bin/ehcache.xml");

    Cache cache = manager.getCache("tprc");
    Element element = new Element("name2", "erik");
    cache.put(element);

    while (true) {
      for (int i = 1; i <= 2; i++) {
        String key = "name" + Integer.toString(i);
        Element got = cache.get(key);
        if (got != null) {
          Date now = new Date();
          long nowLong = now.getTime();
          System.out.println("2 " + got.getObjectKey() + "=" + got.getObjectValue() 
                  + " timeLeft: " + (got.getExpirationTime() - nowLong)/1000);
        }
      }
      Thread.sleep(2000);
    }
  }

これを修正する別の方法は、同期的な bootstrapCacheLoaderFactor を ehcache.xml のキャッシュ構成に追加することです。

<cache name="tprc"
       maxEntriesLocalHeap="10"
       eternal="false"
       timeToIdleSeconds="100"
       timeToLiveSeconds="100">
    <cacheEventListenerFactory
            class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
            properties="replicateAsynchronously=false, replicatePuts=true,
                        replicatePutsViaCopy=true, replicateUpdates=true,
                        replicateUpdatesViaCopy=true, replicateRemovals=true"/>
    <bootstrapCacheLoaderFactory
            class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"
            properties="bootstrapAsynchronously=false, maximumChunkSizeBytes=5000000"/>
</cache>
于 2013-09-12T20:44:22.717 に答える