如何通过Spring Data Gemfire创建Gemfire区域时调用init方法?

时间:2017-05-24 15:23:15

标签: spring-data gemfire spring-data-gemfire

我已成功使用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>

你能告诉我怎样才能实现这个目标?谢谢!

1 个答案:

答案 0 :(得分:1)

是的,SDG core XML namespace(来源here)不允许你这样做。但是,您有几种选择。

  1. 首先,您可以使用{{3>},其中 Spring Data GemFire 提供GemFire's Snapshot Service

  2. 其次,您可以创建一个 Spring support(相关文档BeanPostProcessor),以便在初始化后处理所需的区域以加载一些数据。

  3. 我有一个这样的BeanPostProcessor here的示例,已配置here,并在此here中使用。这是一个非常简单的例子,因为它只使用另一个Map来填充Region(即RegionTwo),但您可以将“regionData”映像为您喜欢的任何源,例如{{1 }}

      

    警告:您必须小心将其他bean注入{em> Spring initLoader,如test class(第3个注释)中所述,因为您可能会导致一系列不受 Spring 容器后处理活动约束的早期bean实例化,例如代理事务管理等问题。所以要小心。

    1. 还可以在 Spring 应用程序上下文中实现并注册 Spring docs,该应用程序上下文与要加载的Region自动装配,数据源为加载Region,然后在ApplicationListener上执行Region数据保护操作。
    2. 像...一样的东西。

      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编码为基于某些启发式(应用程序数据访问模式)加载数据块除了返回单项错过。

      无论如何,你会发现确实没有办法解决你的问题。

      如果您对上述信息有更具体的问题,请与我们联系。

      希望这有帮助!

      干杯, 约翰