2017-07-03 78 views
0

我開發了一個新的連接器。該連接器需要用兩個參數進行配置,讓說:Mule連接器配置需要動態屬性

  • default_trip_timeout_milis
  • default_trip_threshold

enter image description here

的挑戰是,我想讀$ {myValue_a}和$ {myValue_a}從一個API,使用HTTP調用,而不是從文件或內聯值。

由於這是一個連接器,我需要在連接器初始化之前在某處調用此API。

FlowVars不是一個選項,因爲它們是使用Flow進行初始化的,而這在Mule應用生命週期中就已經有了。

我的想法是創建一個的Spring bean實現Initialisable,所以它會連接器都初始化之前,使用任何基於Java庫中調用,在這裏,(春RestTemplate?),調用API,獲取值,並將其儲存某處(上下文?objectStore?),因此連接器可以訪問它們。

有意義嗎?任何其他想法?

謝謝!

回答

1

mmm您可以創建一個類,該類將在啓動時創建屬性,並且在此類中通過http請求獲取API屬性。下面的例子:

public class PropertyInit implements InitializingBean,FactoryBean { 

    private Properties props = new Properties(); 

    @Override 
    public Object getObject() throws Exception { 
     return props; 
    } 

    @Override 
    public Class getObjectType() { 
     return Properties.class; 
    } 
} 

現在你應該可以加載這個屬性類:

<context:property-placeholder properties-ref="propertyInit"/> 

希望你喜歡這個主意。我在之前的項目中使用了這種方法。

+0

它實際上就像魅力!非常感謝! – Marcos

1

我想先給你一個強烈的警告,這樣做。如果沿着這條路走下去,那麼你冒着以非常奇怪的方式破壞你的應用程序的風險,因爲如果任何其他組件依賴於這個組件,你就會在啓動時擁有動態組件,你會打破它們,並且你應該考慮是否有其他方法來實現這一點行爲而不是使用屬性。

也就是說要做到這一點的方法是使用代理模式,這是給你的,只要重建其性質被改變的組件的代理。所以你需要創建一個擴展爲Circuit Breaker的類,該類封裝了Circuit Breaker的實例,並在其屬性發生變化時重新創建。這些屬性不得在代理類外使用其他組件可以讀取這些屬性在啓動時再沒有刷新,你必須牢記這一點是任何可能直接或間接地訪問這些屬性不能在他們的初始化階段或您這樣做應用程序將中斷。

值得看看SpringCloudConfig,它允許你有一個屬性服務器,然後所有的應用程序可以在運行時在它們改變時重新加載這些屬性。不知道如果SpringCloud目前還不支持,但它知道存在一個很好的事情,你可以走這條道路的騾子。

+0

非常感謝。我會調查所有可能的方式! – Marcos