我有一个要求,因为id将通过HTTP请求传递,并且根据该ID,我需要动态调用属性值。
对于一个ID我需要属性
dgc.metamodel.CommunityToSync=Community1
dgc.metamodel.DomainToSync=Domain1
我需要另一个ID
dgc.metamodel.CommunityToSync=Community2
dgc.metamodel.DomainToSync=Domain2
是否可以在Mule中执行此操作?
答案 0 :(得分:0)
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或http://localhost:8081/prop?id=2以获得不同的结果。
答案 1 :(得分:0)
您可以通过首先将属性读入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" />
您可以根据需要构建密钥字符串。
答案 2 :(得分:0)
你可以用groovy来检查你的要求并根据需要发送属性。