2017-05-24 31 views
0

我能够成功地像下面创建使用Spring数据的GemFire一个区域的GemFire -如何通过Spring Data Gemfire创建Gemfire区域时调用init方法?

<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

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

  1. 首先,你可以使用GemFire's Snapshot Service,为此春数据的GemFire提供support

  2. 其次,你可以创建一个BeanPostProcessor(相关文档here)来处理所需的区域初始化后加载了一些数据。

我的一个例子,例如了BeanPostProcessor here,用于here,并在此test class使用。这是一个非常简单的例子,因为它只使用另一个Map来填充区域(即RegionTwo),但是您可以将“regionData”作为您喜欢的任何来源的图像,例如您的initLoader

警告:你必须要小心注入其他bean到作为docs(第3记下)提到你可能会引发一系列早产儿豆实例是不受到的BeanPostProcessors集装箱后处理活动,例如代理交易管理等问题。所以要小心。

  • 也可以实现和在被自动装配与地区弹簧应用程序上下文加载注册弹簧ApplicationListener,数据源加载区域,然后在ContextRefreshedEvent上执行区域数据保湿操作。
  • 喜欢的东西...

    <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容器启动和刷新,毕竟豆子都被初始化,这ApplicationListener,当如春ApplicationContext“bean”的注册,将获得由春天专门为ContextRefreshedEvent解雇,然后将加载您的区域。

    如果您不需要预先加载您的区域,也可以使用其他选项,例如使用通读式按需缓存区域加载功能(文档号here)。虽然,正如我所提到的,只有在发生缓存未命中时才会触发CacheLoader,但是,您仍然可以将CacheLoader编码为基于某些启发式(应用程序数据访问模式)加载数据块,并返回单个条目未命中。

    无论如何,你会发现真正没有什么方法来做你所要求的。

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

    希望这会有所帮助!

    干杯, 约翰

    相关问题