如何使用 Spring Boot for Pivotal GemFire Starter 在 Spring Boot 中实现 GemFire CacheListener

How to implement a GemFire CacheListener in Spring Boot using Spring Boot for Pivotal GemFire Starter

我可以知道如何在我的 Spring Boot 应用程序中实现 GemFire/Geode CacheListener 吗?

我想在我的 "People" 区域中检测删除和更新。我在 Maven 中使用 org.springframework.data:spring-data-gemfire 依赖项。我需要添加任何注释吗?

@SpringBootApplication  
@ClientCacheApplication(name = "AccessingDataGemFireApplication", logLevel = "error")
@EnableEntityDefinedRegions(basePackageClasses = People.class)
@EnableGemfireRepositories  
public class Application
{
....
}

显然,在 spring-data-gemfire 的最新 GA 版本中仍然没有对 GemFire 回调(CacheListenerCacheLoader 等)的注释支持。 JIRA ticket SGF-453 是前段时间创建的以实现此增强功能,您可以将自己添加为 watcher 以获取有关进度的更新。

但是,您可以使用 cache-listener xml 元素手动将 CacheListener 关联到区域,如 documentation. Or, yet another option, you can configure the listener directly through the API using RegionFactoryBean.setListeners.

所示

例如,以下 class 启动带有嵌入式定位器的本地 GemFire 服务器,创建一个名为 PeopleREPLICATED 区域并将自定义 CacheListener 关联到它,基本上每次创建或删除条目时都会打印一条消息:

@EnableLogging
@EnableStatistics
@SpringBootApplication
@CacheServerApplication
public class GemFireServerApplication {

  public static void main(String[] args) {
    SpringApplication.run(GemFireServerApplication.class, args);
  }

  @EnableLocator
  @Profile("!clustered")
  @EnableManager(start = true)
  @Configuration
  static class LonerConfiguration { }

  @Bean("People")
  public ReplicatedRegionFactoryBean<?, ?> replicatedRegion(GemFireCache gemfireCache) {
    ReplicatedRegionFactoryBean<?, ?> replicatedRegion = new ReplicatedRegionFactoryBean<>();
    replicatedRegion.setCache(gemfireCache);
    replicatedRegion.setClose(false);
    replicatedRegion.setPersistent(false);
    replicatedRegion.setCacheListeners(new CacheListener[] { myCacheListener() });

    return replicatedRegion;
  }

  @Bean
  public CacheListener<?, ?> myCacheListener() {
    return new CacheListenerAdapter<String, String>() {
      @Override
      public void afterDestroy(EntryEvent<String, String> event) {
        System.out.println(String.format("AfterDestroy invoked for key %s !", event.getKey()));
        super.afterDestroy(event);
      }

      @Override
      public void afterCreate(EntryEvent<String, String> event) {
        System.out.println(String.format("AfterCreate invoked for key %s !", event.getKey()));
        super.afterCreate(event);
      }
    };
  }
}

希望这对您有所帮助。干杯。

由于您使用的是更方便的 @EnableEntityDefinedRegions SDG 注释(推荐使用,特别是对于简单的 UC),因此您没有显式定义 Region bean 定义(例如使用 SDG 的 ReplicationRegionFactoryBeanPartitionedRegionFactoryBean classes) 正如 Juan Ramos 在他的回答中所做的那样。

在这种情况下,您可以声明一个 RegionConfigurer 来修改 "People" 区域,然后应用相同的技术 Juan 从他对 supply 的回答中所做的CacheListener.

例如:

@SpringBootApplication
@EnableEntityDefinedRegions(basePackageClasses = People.class)
@EnableGemfireRepositories(..)
class MySpringBootGemFireApplication {

  @Bean
  RegionConfigurer peopleRegionConfigurer(
      CacheListener<Long, Person> peopleRegionListener) {

    return new RegionConfigurer() {

      @Override
      public void configure(String beanName, 
          ClientRegionFactoryBean<Long, Person> regionFactory) {

        regionFactoryBean.setCacheListeners(
          new CacheListener[] { peopleRegionListener });
    };
  }

  @Bean
  CacheListenerAdapter<Long, Person> peopleRegionListener() {

    return new CacheListenerAdapter<>() {

        public void afterDestroy(EntryEvent<Long, Person> event) { ... }

        public void afterUpdate(EntryEvent<Long, Person> event) { ... }
    };
  }
}

注意:当使用 Spring 引导时,GemFire Starter (org.springframework.geode:spring-gemfire-starter),绝对不需要 @ClientCacheApplication 注释,因为 SBDG 自动配置一个 ClientCache 实例默认情况下(参见 here)。

注意:此外,如果您的应用程序 GemfireRepositories 位于主要 Spring 引导应用程序 class 下的子包中,您也不需要显式声明 @EnableGemfireRepositories 因为 SBDG 会为您自动配置 SD 存储库基础结构(请参阅 here)。

有关 SDG 配置器的更多信息,请参阅 here

希望这对您有所帮助。