我已成功使用Spring Data Gemfire创建Gemfire区域,如下所示 -
<gfe:replicated-region id="myRegion" name="regionName"/>
我现在想要在创建数据后立即自动将数据加载到我的区域。 所以,我想也许我可以在中定义一个init方法 地区的春天设置。但它不允许我这样做。
<gfe:replicated-region id="myRegion" name="regionName">
<gfe:init-method>
<ref bean="initLoader"/>
</gfe:init-method>
</gfe:replicated-region>
你能告诉我怎样才能实现这个目标?谢谢!
答案 0 :(得分:1)
是的,SDG core XML namespace(来源here)不允许你这样做。但是,您有几种选择。
首先,您可以使用{{3>},其中 Spring Data GemFire 提供GemFire's Snapshot Service。
其次,您可以创建一个 Spring support(相关文档BeanPostProcessor),以便在初始化后处理所需的区域以加载一些数据。
我有一个这样的BeanPostProcessor here的示例,已配置here,并在此here中使用。这是一个非常简单的例子,因为它只使用另一个Map
来填充Region(即RegionTwo
),但您可以将“regionData”映像为您喜欢的任何源,例如{{1 }}
警告:您必须小心将其他bean注入{em> Spring
initLoader
,如test class(第3个注释)中所述,因为您可能会导致一系列不受 Spring 容器后处理活动约束的早期bean实例化,例如代理事务管理等问题。所以要小心。
ApplicationListener
上执行Region数据保护操作。像...一样的东西。
BeanPostProcessors
<bean class="org.example.app.event.MyContextRefreshedEventListener"/>
的定义如下......
MyContextRefreshedEventListener
当Spring容器启动并刷新时,在初始化了所有bean之后,当{em> {1}}中注册为“bean”时,此package org.example.app.event;
import ...;
class MyContextRefreshedEventListener
extends ApplicationListener<ContextRefreshedEvent> {
@Resource(name = "RegionToLoad")
Region<?, ?> regionToLoad;
// Data Source used to hydrate/load the Region on startup
@Autowired
DataSource dataSource;
public void onApplicationEvent(ContextRefreshedEvent event) {
// load the Region using DataSource
}
}
将被触发Spring 专门用于ApplicationListener
,然后加载你的Region。
如果您不需要提前加载Region,还有其他选项,例如使用GemFire的ContextRefreshedEvent
功能(docs CacheLoader
)使用read-through,按需缓存区域加载。虽然,正如我所提到的,ApplicationContext
仅在发生缓存未命中时才会被触发,但是,您可以将ContextRefreshedEvent
编码为基于某些启发式(应用程序数据访问模式)加载数据块除了返回单项错过。
无论如何,你会发现确实没有办法解决你的问题。
如果您对上述信息有更具体的问题,请与我们联系。
希望这有帮助!
干杯, 约翰