在 运行 时间动态检索 Mule 流的属性值

Retrieve properties value dynamically on run-time for a Mule flow

我有一个要求,比如 ID 将通过 HTTP 请求传递,并且根据该 ID,我需要动态调用属性值。

对于一个 ID,我需要像这样的属性 dgc.metamodel.CommunityToSync=Community1 dgc.metamodel.DomainToSync=Domain1

我需要另一个ID dgc.metamodel.CommunityToSync=Community2 dgc.metamodel.DomainToSync=Domain2

是否可以在 Mule 中执行此操作?

AFAIK,属性 文件将在服务器为 运行 时第一次读取。虽然有很多属性只有一个键(唯一)将被引用。

但是为了满足这个要求,我认为我们应该使用 Java 代码。此代码将负责根据请求 (id) 读取某些 属性 文件。然后读取 属性 并将其设置为变量以供进一步使用:

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>

通过浏览器执行:http://localhost:8081/prop?id=1 or http://localhost:8081/prop?id=2得到不同的结果。

您可以通过先将属性读入 Map 来实现:

您可以使用 Spring 将它们直接加载到地图中,如下所示:

<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>

并使用 MEL 在您的流程中动态访问它,类似于:

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

您可以根据需要构建密钥字符串。

您可以使用 groovy 检查您的要求并根据需要发送属性。