在 运行 时间动态检索 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 检查您的要求并根据需要发送属性。
我有一个要求,比如 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 检查您的要求并根据需要发送属性。