2013-06-02 68 views
1

我有一個Mule流,其中有一個會話變量「servicerequested」,並且此變量可以具有不同的值,如 - customerservice,accountservice,transferservice等。Mule表達式語言從屬性文件中動態讀取屬性

有一個屬性文件mule.dev.properties其中有基於此服務選項端口的信息:

customerservice=9914 
accountservice=9918 
transferservice=9919 

我想要一個HTTP出站端點選擇從這個屬性端口文件基於變量requestedservice。 我試着用下面的MEL:

$ {#[標題:會話:servicerequested]}

<http:outbound-endpoint exchange-pattern="request-response" host="localhost" 
port="${#[header:session:servicerequested]}" path="services" method="GET"/> 

但它拋出異常

Template Endpoint "http://localhost:session:servicerequested]/services" resolved 
into a Malformed endpoint "http://localhost:session:servicerequested]/services" 

請讓我知道我們如何能夠使用MEL動態讀取屬性文件。

+0

你的問題解決了嗎? – user1760178

回答

0

從你的帖子我可以看到,會話變量是根據哪個屬性文件中的值被挑選出來的條件。

但問題是一旦你的應用程序被部署,屬性文件被加載。但會話變量僅在流程執行期間可用。

所以表達式$ {#[header:session:servicerequested]}將不起作用,因爲在屬性文件引用值時,#[MEL]還不可用。

可能的解決方案可能是將您的屬性加載到某些流量變量中,然後根據會話變量值選擇其中一個流量變量。

所有這些都不可能發生在單個MEL語句中。

存儲嘗試像下面

<set-variable variableName="prop1" value="${property key from properties file}" /> 
<set-variable variableName="prop2" value="${property key from properties file}" /> 

屬性流變量,然後建立一個自定義組件或常規評估會議varaible和挑流varaibles之一,然後用你的端口屬性,該屬性值。

希望這有助於:)

+0

你的建議很好David!謝謝。但在我的情況下,我們不知道屬性文件中有多少屬性。所以應該創建多少變量是動態的。 – user2254601

+0

如果您不確定屬性文件中將存在多少屬性,那麼我不確定在這種情況下可以提供哪些幫助。但是如果你有太多的屬性被聲明爲流變量。然後用所有這些屬性作爲從屬性文件加載的常量來準備pojo bean,然後嘗試根據session屬性訪問bean中的常量。 – user1760178

0

您可以創建Java組件,並讀取屬性directly.It最簡單的解決方案。 替代方法可以是在Spring中配置ReloadableResourceBundleMessageSource以讀取屬性。