提问者:小点点

如何调用init方法时,Gemfire区域被创建通过Spring数据Gemfire?


我成功地能够使用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>

你能告诉我如何才能做到这一点吗?谢谢!


共1个答案

匿名用户

是的,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进行编码,以便除了返回单个条目未命中之外,还可以根据一些启发式方法(应用程序数据访问模式)加载数据块。

    不管怎样,你会发现,做你要求的事情真的不缺方法。

    如果您对上述信息有更具体的问题,请告诉我。

    希望这有帮助!

    干杯约翰