我成功地能够使用Spring Data Gemfire创建一个Gemfire区域,如下所示-
<gfe:replicated-region id="myRegion" name="regionName"/>
我现在想在数据创建后立即自动加载到我的区域中。所以,我想也许我可以在该区域的Spring设置中定义一个init方法。但它不允许我这样做。
<gfe:replicated-region id="myRegion" name="regionName">
<gfe:init-method>
<ref bean="initLoader"/>
</gfe:init-method>
</gfe:replicated-region>
你能告诉我如何才能做到这一点吗?谢谢!
是的,SDG核心XML命名空间(来源在这里)不允许您这样做。但是,您确实有几个选择。
>
首先,您可以使用GemFire的Snapshot Service,Spring Data GemFire为其提供支持。
其次,您可以创建一个Spring BeanPostProcess(此处为相关文档)来在初始化后处理所需的Region以加载一些数据。
我这里有一个这样的BeanPostProcess的例子,在这里配置,并在这个测试类中使用。这是一个非常简单的例子,因为它只使用另一个Map
来填充区域(即Region onTwo
),但是您可以将“region onData”想象成您喜欢的任何源,例如您的initLoader
。
警告:您必须小心将其他bean注入到文档中提到的SpringBeanPostProcess
,因为您可能会导致一系列不受Spring容器后处理活动约束的过早bean实例化,例如代理事务管理等问题。所以要小心。
像这样的东西…
<bean class="org.example.app.event.MyContextRefreshedEventListener"/>
其中MyContextReFreshedEventListener
的定义如下…
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容器启动并刷新时,在所有bean都被初始化后,当在SpringApplicationContext
中注册为“bean”时,这个ApplicationListener
将被Spring专门为ContextReflhedEvent
触发,然后它将加载您的Region。
如果您不需要提前加载您的区域,也可以使用其他选项,例如使用具有GemFire的CacheLoader
功能的读取、按需缓存区域加载(此处文档)。尽管正如我所提到的,CacheLoader
仅在发生缓存未命中时才会触发,但您仍然可以对CacheLoader
进行编码,以便除了返回单个条目未命中之外,还可以根据一些启发式方法(应用程序数据访问模式)加载数据块。
不管怎样,你会发现,做你要求的事情真的不缺方法。
如果您对上述信息有更具体的问题,请告诉我。
希望这有帮助!
干杯约翰