Как правило, использование 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!