Как реализовать GemFire ​​CacheListener в Spring Boot с использованием Spring Boot для Pivotal GemFire ​​Starter - PullRequest
0 голосов
/ 30 марта 2019

Могу ли я узнать, как реализовать GemFire ​​/ Geode CacheListener в моем приложении Spring Boot ?

Я хочу обнаружить удаление и обновление в моем регионе "Люди".Я использовал org.springframework.data:spring-data-gemfire зависимость в Maven.Нужно ли включать какие-либо аннотации?

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

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

По-видимому, до сих пор нет поддержки аннотаций для обратных вызовов GemFire ​​(CacheListener, CacheLoader и т. Д.) В последней версии GA spring-data-gemfire. Билет JIRA SGF-453 был создан некоторое время назад для реализации этого усовершенствования. Вы можете добавить себя как наблюдатель , чтобы получать обновления о прогрессе.

Однако вы можете вручную связать CacheListener с регионом, используя элемент cache-listener xml, как показано в документации . Или, еще один вариант, вы можете настроить слушателя напрямую через API, используя RegionFactoryBean.setListeners.

В качестве примера следующий класс запускает локальный сервер GemFire ​​со встроенным локатором, создает область REPLICATED с именем People и связывает с ней пользовательский 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);
      }
    };
  }
}

Надеюсь, это поможет. Приветствия.

0 голосов
/ 04 апреля 2019

Поскольку вы используете более удобную аннотацию @EnableEntityDefinedRegions SDG (что рекомендуется, особенно для простых UC), то вы явно не определяете определение bean-объекта Region (например, используя классы ReplicationRegionFactoryBean или PartitionedRegionFactoryBean SDG) как Хуан Рамос сделал в своем ответе.

В этом случае вы можете объявить RegionConfigurer, чтобы изменить регион "Люди", а затем применить ту же технику, которую Хуан сделал из своего ответа, чтобы предоставить 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 Boot, GemFire ​​Starter (org.springframework.geode:spring-gemfire-starter), аннотация @ClientCacheApplication определенно не требуется, поскольку SBDG автоматически конфигурирует экземпляр ClientCache по умолчанию (см. здесь ) ,

ПРИМЕЧАНИЕ. Кроме того, если ваше приложение GemfireRepositories находится в подпакете ниже основного класса приложения Spring Boot, вам также не нужно явно объявлять @EnableGemfireRepositories, поскольку SBDG автоматически конфигурирует инфраструктуру хранилища SD для вас. (см. здесь ).

Для получения дополнительной информации о конфигураторах SDG см. здесь .

Надеюсь, это поможет.

...