2017-05-24 60 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編碼爲基於某些啓發式(應用程序數據訪問模式)加載數據塊,並返回單個條目未命中。

    無論如何,你會發現真正沒有什麼方法來做你所要求的。

    如果您對上述信息有更具體的疑問,請告訴我。

    希望這會有所幫助!

    乾杯, 約翰