2

Amazon EC2 上の 2 つの JBoss 4.2 サーバー間で EHCache RMI ベースのキャッシュ レプリケーションを作成しようとしています。現在、これは、Server2 から Server1 への一方向レプリケーションを使用する手動ピア検出として設定されています。

以下の構成:

サーバー 1

<cacheManagerPeerProviderFactory
   class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
   properties="peerDiscovery=manual"/>

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

<cache name="cache1"
        maxElementsInMemory="0"
        eternal="false"
        overflowToDisk="true"
        timeToIdleSeconds="600"
        timeToLiveSeconds="600"
        diskPersistent="true"
        diskExpiryThreadIntervalSeconds="60"
        statistics="true">
        <cacheEventListenerFactory
                          class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
                          properties="replicatePuts=false, replicateUpdates=false, 
                replicateRemovals=false"/>
</cache>

サーバー 2

<cacheManagerPeerProviderFactory
   class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
   properties="peerDiscovery=manual,
             rmiUrls=//host1:40001/cache1"/>

<cacheManagerPeerListenerFactory
   class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
   properties="hostName=host2, port=40002,  
                     socketTimeoutMillis=3000"/>

<cache name="cache1"
        maxElementsInMemory="0"
        eternal="false"
        overflowToDisk="false"
        timeToIdleSeconds="7200"
        timeToLiveSeconds="7200">
        <cacheEventListenerFactory
                          class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
                          properties="replicateAsynchronously=false"/>
    </cache>

ただし、新しい要素を Server2 のキャッシュに入れると、次の例外がスローされます。

Jul 10, 2012 3:25:37 PM net.sf.ehcache.distribution.RMISynchronousCacheReplicator replicatePutNotification
SEVERE: Exception on replication of putNotification. no such object in table. Continuing...
java.rmi.NoSuchObjectException: no such object in table
          at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
          at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
          at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142)
          at net.sf.ehcache.distribution.RMICachePeer_Stub.put(Unknown Source)
          at net.sf.ehcache.distribution.RMISynchronousCacheReplicator.replicatePutNotification(RMISynchronousCacheReplicator.java:149)
          at net.sf.ehcache.distribution.RMISynchronousCacheReplicator.notifyElementPut(RMISynchronousCacheReplicator.java:132)
          at net.sf.ehcache.event.RegisteredEventListeners.notifyListener(RegisteredEventListeners.java:294)
          at net.sf.ehcache.event.RegisteredEventListeners.invokeListener(RegisteredEventListeners.java:284)
          at net.sf.ehcache.event.RegisteredEventListeners.internalNotifyElementPut(RegisteredEventListeners.java:144)
          at net.sf.ehcache.event.RegisteredEventListeners.notifyElementPut(RegisteredEventListeners.java:122)
          at net.sf.ehcache.Cache.notifyPutInternalListeners(Cache.java:1515)
          at net.sf.ehcache.Cache.putInternal(Cache.java:1490)
          at net.sf.ehcache.Cache.put(Cache.java:1417)
          at net.sf.ehcache.Cache.put(Cache.java:1382)

また、JBoss サーバーの代わりに、Server2 をスタンドアロン Java プログラムとして (上記と同じ ehcache.xml を使用して) 試しました。しかし、Server1 が JBoss サーバーである限り、この例外が表示されます。

Server1 と Server2 (JBoss または Java プログラム) を同じホストにデプロイすると、うまく機能します。しかし、それらを別のホストに移動するとすぐに、それは私にとって死にます。

どんな助けでも大歓迎です。ありがとう ...

4

1 に答える 1

0

java.rmi.NoSuchObjectExceptionスタブによって参照されるオブジェクトが現在エクスポートされていないことを意味します。ある時点でエクスポートされている必要があります。そうでない場合、スタブはありません。おそらく、最初に DGC、次にローカル GC のガベージ コレクションが行われた可能性があります。静的変数にリモート オブジェクト (スタブではなく) への参照を保持することで、これを防ぐことができます。しかし、問題のリモート オブジェクトはあなたのものではなく、彼らのもののようです。この場合、彼らのバグ報告システムを見つける必要があります。

于 2012-07-11T00:40:14.840 に答える