如何使用 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 回调(CacheListener
、CacheLoader
等)的注释支持。 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 服务器,创建一个名为 People
的 REPLICATED
区域并将自定义 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 的 ReplicationRegionFactoryBean
或PartitionedRegionFactoryBean
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。
希望这对您有所帮助。
我可以知道如何在我的 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 回调(CacheListener
、CacheLoader
等)的注释支持。 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 服务器,创建一个名为 People
的 REPLICATED
区域并将自定义 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 的 ReplicationRegionFactoryBean
或PartitionedRegionFactoryBean
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。
希望这对您有所帮助。