2016-07-20 39 views
1

我有一個像id這樣的需求將通過HTTP請求傳遞,並根據該ID我需要動態調用屬性值。在運行時爲騾流動動態檢索屬性值

對於一個ID,我需要像 dgc.metamodel.CommunityToSync=Community1 dgc.metamodel.DomainToSync=Domain1

屬性對於另一個ID我需要一個像 dgc.metamodel.CommunityToSync=Community2 dgc.metamodel.DomainToSync=Domain2

是否有可能做到這一點的騾子?

回答

0

AFAIK,屬性文件將在第一次運行服務器時讀取。雖然有許多屬性只有一個關鍵字(唯一的)將被引用。

但是爲了適應這個要求,我認爲我們應該利用Java代碼。該代碼將負責根據請求(id)讀取特定的屬性文件。然後讀取屬性並將其設置爲可變的進一步使用:http://localhost:8081/prop?id=1http://localhost:8081/prop?id=2得到不同的結果:

private Properties prop = new Properties(); 
private InputStream input = null; 

public Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException {  
    String id = ((ParameterMap)message.getInboundProperty("http.query.params")).get("id"); 
    input = getClass().getResourceAsStream("../property" + id + ".properties"); 
    prop.load(input); 

    message.setInvocationProperty("communityToSync", prop.getProperty("dgc.metamodel.CommunityToSync")); 
    message.setInvocationProperty("domainToSync", prop.getProperty("dgc.metamodel.DomainToSync")); 

我用一個簡單的流程

<flow name="propertyFlow"> 
    <http:listener config-ref="HTTP_Listener_Configuration" path="/prop" allowedMethods="GET" doc:name="HTTP"/> 
    <custom-transformer class="example.ReadProperty" doc:name="Java"/> 
    <logger message="CommunityToSync = #[flowVars.communityToSync], DomainToSync = #[flowVars.domainToSync]" level="INFO" doc:name="Logger"/> 
</flow> 

執行它通過瀏覽器進行了測試。

+0

我在啓動Mule服務器時發生異常,部署失敗,出現錯誤:'創建名爲'propertyFlow'的bean時出錯:bean初始化失敗;嵌套異常未能將類型'java.util.ArrayList'的屬性值轉換爲屬性'messageProcessors'所需的類型'java.util.List';無法將[test_project.ReadProperty]類型的值轉換爲屬性'messageProcessors [0]'所需的類型[org.mule.api.processor.MessageProcessor]:沒有找到匹配的編輯器或轉換策略'我將消息作爲返回值傳遞給此transformMessage方法。 – Arkade

+0

我通過擴展AbstractMessageTransformer類來解決了問題。 – Arkade

0

您可以通過讀取性能爲地圖第一實現這一目標:

您可以直接加載它們到使用Spring像這樣的地圖:動態地在你的流量使用MEL

<spring:beans> 
     <spring:bean id="appProps" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
      <spring:property name="singleton" value="true"/> 
      <spring:property name="location" value="classpath:application.properties"/> 
     </spring:bean> 
    </spring:beans> 

和訪問類似於:

<logger message="My prop #[app.registry.appProps[flowVars.someKey]]" level="INFO" /> 

而且您可以根據需要構建密鑰字符串。

+0

問題是如何在運行時動態讀取不同文件的屬性(使用相同的密鑰)。 –

0

你可以用groovy去檢查你的需求,並根據需要發送屬性。