Spring Data Geode Region имеет локальную область и не может прослушивать события удаленного Region - PullRequest
0 голосов
/ 12 февраля 2020

Я использую Spring Data для Apache Geode для приложения Spring Boot, которое использует удаленный Apache Geode сервер. Для настройки локальных регионов я использую класс @Configuration, например:

@Configuration
public class GeodeConfig {

  public static Region<String, String> myRegion;

  @Bean("setupMyRegion")
  public Region<String, String> setupMyRegion(GemFireCache cache) {

    Region<String, String> r = cache.getRegion("myRegion");
    myRegion = r;

    return r;
  }
}

Это позволяет мне размещать и получать данные с помощью региона.

Когда я регистрирую интерес к подписке на ключ, подписка настраивается с областью действия = LOCAL, как это:

org.apach.geode.inter.cache.LocalRegion 4439 logKeys: org.apache.geode.internal.cache.LocalRegion[path='/myRegion';scope=LOCAL';dataPolicy=NORMAL; concurrencyChecksEnabled] refreshEntriesFromServerKeys count=1 policy=KEYS_VALUES

, и я предполагаю, что я хочу установить ее как CACHING_PROXY так что позже, при подписке на события в Регионе, локальная подписка будет видеть события Региона сервера.

Я установил subscriptionEnabled=TRUE для @ClientCacheApplication, и я пытаюсь установить

clientRegionShortcut = ClientRegionShortcut.CACHING_PROXY 

Я не знаю, где это сделать. Я попробовал аннотацию @EnableClusterDefinedRegions, но Region по-прежнему устанавливается как локальный.

Если я пытаюсь создать фабрику регионов из GemFireCache, выдает ошибку, что метод createClientRegionFactory(ClientRegionShortcut) "undefined" для типа GemFireCache.

СПАСИБО

Ответы [ 2 ]

3 голосов
/ 12 февраля 2020

Как правило, использование Geode API напрямую для настройки bean-компонентов в контексте Spring является плохой практикой. Например ...

  @Bean("MyRegion")
  public Region<String, Object> myRegion(GemFireCache cache) {
    return cache.getRegion("myRegion");
  }

Или используя:

  @Bean("MyRegion")
  public Region<String, Object> myRegion(ClientCache clientCache) {
    return clientCache.createClientRegionFactory(ClientRegionShortcut.CACHING_PROXY)
      .create("MyRegion");
  }

Оба вышеуказанных подхода не рекомендуются!

Данные пружины для Apache Geode (SDG) содержится спецификация c Spring FactoryBeans, чтобы сделать то же самое. Например, SDG ClientRegionFactoryBean.

Вы можете использовать ClientRegionFactoryBean в конфигурации приложения Spring следующим образом:

@Bean("MyRegion")
ClientRegionFactoryBean<String, Object> myRegion(ClientCache clientCache) {

  ClientRegionFactoryBean<String, Object> myRegion = 
    new ClientRegionFactoryBean<>();

  myRegion.setCache(clientCache);
  myRegion.setShortcut(ClientRegionShortcut.CACHING_PROXY);

  return myRegion;
}

Есть SDG FactoryBeans для различных типов объектов Geode, таких как [клиент] Regions, Indexes, DiskStores, GatewayReceivers, GatewaySenders, et c.

Эти FactoryBeans необходимы для обеспечения правильной синхронизации «жизненного цикла» объектов Geode (например, Region(s)) с жизненным циклом контейнера Spring . Отказавшись от использования SDG FactoryBeans, вы фактически игнорируете координацию жизненного цикла, обеспечиваемую контейнером Spring и пользовательским (framework) FactoryBeans, и, следовательно, несете ответственность за жизненный цикл самих объектов Geode при использовании API Geode direct в конфигурации Spring . Это одна из основных причин, по которой SDG существует в первую очередь.

"Клиент" Region должен быть *PROXY (например, PROXY или CACHING_PROXY), чтобы включить подписку и получать интересные события с серверов для этого региона. Это связано с тем, что кластер Geode (серверы) поддерживает очередь подписки для клиентов при подключении, которые содержат события, которые клиент выразил заинтересованность в получении.

Для *PROXY client Regions, это также означает, что клиент Region должен иметь соответствующий серверный одноранговый кэш Region с тем же именем.

Вы можете упростить создание области в целом и создание области клиента в частности, используя SDG на основе аннотаций модель конфигурации, а именно, @EnableEntityDefinedRegions или @EnableCachingDefinedRegions.

Например:

@ClientCacheApplication(subscriptionsEnabled = true)
@EnableEntityDefinedRegions(basePackageClasses = SomeEntity.class, 
  clientRegionShortcut = ClientRegionShortcut.CACHING_PROXY)
class GeodeConfiguration {
  ...
}

Конечно, это предполагает, что вы определили классы сущностей модели предметной области приложения, такие как:

package example.app.model;

import ...;

@Region("MyRegion")
class SomeEntity {

  @Id
  private Long id;

  ...
}

Введите ClientRegionFactoryBean соответственно: ClientRegionFactoryBean<Long, SomeEntity>.

См. Модель конфигурации на основе аннотаций SDG документация для получения более подробной информации, в частности Конфигурация аннотации, охватывающая определения регионов .

Аннотация @EnableClusterDefinedRegions определяет сторону клиента Regions для всех существующих сторона сервера (кластер) Regions, к которой подключается клиент.

Например, если вы запускаете кластер в Gf sh следующим образом:

gfsh>start locator --name=MyLocator ...

gfsh>start server --name=MyServer ...

gfsh>create region --name=Example --type=PARTITION

gfsh>create region --name=AnotherExample --type=REPLICATE

А затем подключите Spring Boot , Apache Geode ClientCache к этому кластеру, используя следующую конфигурацию Geode:

@ClientCacheApplication
@EnableClusterDefinedRegions(clientRegionShortcut = 
  ClientRegionShortcut.CACHING_PROXY)
class GeodeConfiguration {
  ...
}

Затем Spring Boot , Apache Приложение Geode ClientCache будет иметь 2 настроенные Spring клиентские компоненты Region с именами «Example» и «AnotherExample» обоих типов, CACHING_PROXY.

Если есть НЕТ серверных областей в настоящее время в кластере, тогда @EnableClusterDefinedRegions не будет определять какие-либо клиентские области.

В любом случае, я надеюсь, что это имеет смысл и поможет!

Cheers!

0 голосов
/ 14 февраля 2020

Основная проблема заключалась в том, что класс, в котором я хотел использовать регионы Geode, не регистрировался в контейнере Spring, потому что я использовал new для использования этого класса вместо @Autowired аннотации для Spring. Это означало, что когда я настраивал области Geode для ответа @ JohnBlum, используя @Resource(name = "Example") private Region<Object, Object> example, автопроводка все еще производила нулевые объекты.

Также класс, в котором я хотел использовать регионы, был в другом пакете вне моего @ComponentScan, поэтому мне пришлось изменить @ComponentScan, чтобы найти этот пакет.

Дело в том, что однажды Я прошел через эти конфигурации и правильно настроил @EnableClusterDefinedRegions (очень легко, когда вы знаете, как !!), и я могу поставить и получить с регионами, регистр интересов не работает .

Проблема с register interests заключалась в том, что у моего application.properties было

spring.data.gemfire.cache.client.durable-client-id=myListener

, и когда я удалил это свойство, CacheListenerAdapter начал получать события с сервера!

...