0

Spring-data-gemfire を使用して、既存のアプリケーション コードを起動する Gemfire に移植しようとしています。したがって、基本的には、領域構成を cache.xml から spring コンテキストに移動しています。

使用したバージョン: Gemfire 6.6.3.2 Spring-data-gemfire-1.3.4 Jdk 7

キャッシュ リスナーを構成する必要があるところまでは、すべて問題なく動作します。リージョンの単純なキャッシュ リスナーは機能しますが、キャッシュ リスナーをサブリージョンで機能させることができません。

例として、以下のリージョンがあります。/User/Details/Address 領域が更新されたときに、CacheUpdateListener (CacheListener インターフェースを実装する) に通知してほしい。私はすでにcache.xmlの方法で動作しているので、Gemfireがそれをサポートしていることを知っています。しかし、これを Spring-data-gemfire で動作させることができるかどうかは誰にもわかりません。これは私が試したもので、うまくいきませんでした。

<gfe:replicated-region id="VCCache" name="User" scope="distributed-no-ack">
    <gfe:replicated-region name="Details" scope="distributed-no-ack">
        <gfe:replicated-region name="Address" scope="distributed-ack">
            <gfe:cache-listener>
                <bean class="com.vc.cache.CacheUpdateListener" />
            </gfe:cache-listener>
        </gfe:replicated-region>
    </gfe:replicated-region>
</gfe:replicated-region>    

** 編集: リスナー コードを追加しました ここにリスナーがあります。簡潔にするために、すべてのオーバーライドされた関数をここに記載していません。

public class CacheUpdateListener implements CacheListener<Object, Object>
{
private static final Logger LOGGER = LoggerFactory.getLogger(CacheUpdateListener.class);

private String name = "defaultName";

@Override
public void afterCreate(EntryEvent<Object, Object> event)
{
    LOGGER.info("[afterCreate] region [{}] key [{}] created remote [{}] with value [{}]",
            new Object[] { event.getRegion().getFullPath(), event.getKey(), event.isOriginRemote(), event.getNewValue() });
}

@Override
public void afterUpdate(EntryEvent<Object, Object> event)
{
    LOGGER.info("[afterUpdate] region [{}] key [{}] updated remote [{}] with value [{}] old value [{}]",
            new Object[] { event.getRegion().getFullPath(), event.getKey(), event.isOriginRemote(), event.getNewValue(), event.getOldValue() });
}
}
4

2 に答える 2

0

SDG で構成された登録済み CacheListener を持つ Peer Cache Subregion を使用して簡単なテストを作成し、リスナーが期待どおりにコールバックされました。これが機能しない他の要因または理由がある可能性があります...

  1. SDG XML 構成全体を把握していませんが、競合する Region 定義を持つ Spring 構成でネイティブ GemFire cache.xml を使用するなど、競合する GemFire 構成が実行されている可能性があります (ただし、 afterRegionCreate が呼び出されていると述べています)、たとえば ...

2. テストでは SDG 1.4.0.RELEASE と GemFire 7.0.2.12 および 8 の両方を使用していました。ただし、私のテストとSDG XML構成の例の両方を使用して、セットアップでテストできるはずです...

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/subRegionCacheListener.xml")
@SuppressWarnings("unused")
public class SubRegionCacheListenerTest {

  private static final Stack<EntryEvent<Integer, String>> entryEvents = new Stack<EntryEvent<Integer, String>>();

  @Resource(name = "/Parent/Child")
  private Region<Integer, String> child;

  @Test
  public void testCacheListenerCallback() {
    assertNotNull("The '/Parent/Child' Cache Sub-Region was not properly configured and initialized!", child);
    assertEquals("Child", child.getName());
    assertEquals("/Parent/Child", child.getFullPath());
    assertTrue(child.isEmpty());
    assertTrue(entryEvents.isEmpty());

    child.put(1, "TEST");

    assertFalse(child.isEmpty());
    assertEquals(1, child.size());
    assertEquals("TEST", child.get(1));
    assertFalse(entryEvents.isEmpty());

    EntryEvent event = entryEvents.pop();

    assertNotNull(event);
    assertEquals(1, event.getKey());
    assertNull(event.getOldValue());
    assertEquals("TEST", event.getNewValue());
    assertTrue(entryEvents.isEmpty());

    child.put(1, "TESTING");

    assertFalse(child.isEmpty());
    assertEquals(1, child.size());
    assertEquals("TESTING", child.get(1));
    assertFalse(entryEvents.isEmpty());

    event = entryEvents.pop();

    assertNotNull(event);
    assertEquals(1, event.getKey());
    assertEquals("TEST", event.getOldValue());
    assertEquals("TESTING", event.getNewValue());
    assertTrue(entryEvents.isEmpty());

    child.remove(1);

    assertTrue(child.isEmpty());

    event = entryEvents.pop();

    assertNotNull(event);
    assertEquals(1, event.getKey());
    assertEquals("TESTING", event.getOldValue());
    assertNull(event.getNewValue());
  }

  public static final class SubRegionCacheListener extends CacheListenerAdapter<Integer, String> {

    @Override
    public void afterCreate(final EntryEvent<Integer, String> event) {
      entryEvents.push(event);
    }

    @Override
    public void afterDestroy(final EntryEvent<Integer, String> event) {
      entryEvents.push(event);
    }

    @Override
    public void afterUpdate(final EntryEvent<Integer, String> event) {
      entryEvents.push(event);
    }
  }
}

そして、対応する SDG XML 構成...

<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:gfe="http://www.springframework.org/schema/gemfire"
   xmlns:util="http://www.springframework.org/schema/util"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/gemfire http://www.springframework.org/schema/gemfire/spring-gemfire.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
">

  <util:properties id="gemfireProperties">
    <prop key="name">SpringGemFirePeerCacheSubRegionCacheListenerTest</prop>
    <prop key="mcast-port">0</prop>
    <prop key="log-level">config</prop>
  </util:properties>

  <gfe:cache properties-ref="gemfireProperties"/>

  <gfe:replicated-region id="Parent">
    <gfe:replicated-region name="Child">
      <gfe:cache-listener>
        <bean class="org.spring.data.gemfire.cache.SubRegionCacheListenerTest$SubRegionCacheListener"/>
      </gfe:cache-listener>
    </gfe:replicated-region>
  </gfe:replicated-region>

</beans>

お役に立てれば。

おそらく、ここに構成の問題があるか、GemFire 6.x に問題がある可能性があります (ただし、GemFire の cache.xml で動作すると述べていますか?)。

于 2014-08-27T18:33:38.017 に答える