一. 属性占位(property-placeholder)
Mule 利用 spring context:property-placeholder 就能实现属性替换。比如:下面的 ${address} 通过 test.properties 里的 address 属性替换。
将来开发有数据库操作的时候,就可以把数据库相关配置放在jdbc.properties里了。
<?xml version="1.0" encoding="UTF-8"?> <mule xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:context="http://www.springframework.org/schema/context" xmlns:spring="http://www.springframework.org/schema/beans" version="CE-3.3.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd http://www.mulesoft.org/schema/mule/scripting http://www.mulesoft.org/schema/mule/scripting/current/mule-scripting.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd "> <context:property-placeholder location="classpath:test.properties"></context:property-placeholder> <flow name="mule-maven-testFlow1" doc:name="mule-maven-testFlow1"> <http:inbound-endpoint exchange-pattern="request-response" address="http://${address}" doc:name="HTTP"/> <logger message="#[groovy:message.toString()]" level="INFO" doc:name="Logger Message"/> <scripting:component doc:name="Groovy"> <scripting:script engine="Groovy" file="scripts/build-response.groovy"/> </scripting:component> </flow> </mule>
注意:新创建的 xxx.mflow 中并没有 xmlns:context 要用 context:property-placeholder 必须加上:
xmlns:context="http://www.springframework.org/schema/context"
因为 Mule 工程遵从 maven 规范,所以 test.properties 直接放在 src/main/resources 下即可。(还可以放在 src/main/app 下)
二. 读取 properties
类似的,将某个properties放在 src/main/resources 下,就可以通过 spring 配置来读取它。因此我们实现一个 PropertyUtils 静态类来实现读取。
package com.neusoft.fx; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class PropertyUtils { private static Properties properties; public void init() { ClassLoader loader = Thread.currentThread().getContextClassLoader(); InputStream resourceAsStream = loader.getResourceAsStream("message.properties"); properties = new Properties(); try { properties.load(resourceAsStream); } catch (IOException e) { e.printStackTrace(); } } public static String get(String key) { return (String)properties.get(key); } }mule 的配置:
<?xml version="1.0" encoding="UTF-8"?> <mule xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:context="http://www.springframework.org/schema/context" xmlns:spring="http://www.springframework.org/schema/beans" version="CE-3.3.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd http://www.mulesoft.org/schema/mule/scripting http://www.mulesoft.org/schema/mule/scripting/current/mule-scripting.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd "> <context:property-placeholder location="classpath:test.properties"></context:property-placeholder> <spring:beans> <spring:bean id="propertyUtils" init-method="init" scope="singleton" class="com.neusoft.fx.PropertyUtils" name="Bean"/> </spring:beans> <flow name="mule-maven-testFlow1" doc:name="mule-maven-testFlow1"> <http:inbound-endpoint exchange-pattern="request-response" address="http://${address}" doc:name="HTTP"/> <logger message="#[groovy:message.toString()]" level="INFO" doc:name="Logger Message"/> <scripting:component doc:name="Groovy"> <scripting:script engine="Groovy" file="scripts/build-response.groovy"/> </scripting:component> <logger message="#[groovy:message.toString()]" level="INFO" doc:name="Logger Message"/> </flow> </mule>在 groovy 中也可以直接使用:
import com.neusoft.fx.*; def contentType = message.getInboundProperty("Content-Type"); def response = ""; if (contentType == "application/xml") { response = PropertyUtils.get("response.xml"); } else { response = PropertyUtils.get("response.json"); } response
通过 Mule IDE 创建的 mule 工程中并没有log4j的配置文件,直接拷贝一份到 src/main/resources 下即可实现对 mule 应用的log配置。
例:
# Default log level log4j.rootCategory=INFO,console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%-5p %d [%t] %c: %m%n #log4j.appender.INFO=org.apache.log4j.ConsoleAppender #log4j.appender.INFO.layout=org.apache.log4j.PatternLayout #log4j.appender.INFO.layout.ConversionPattern=%-5p %d [%t] %c: %m%n ################################################ # You can set custom log levels per-package here ################################################ # CXF is used heavily by Mule for web services log4j.logger.org.apache.cxf=WARN # Apache Commons tend to make a lot of noise which can clutter the log. log4j.logger.org.apache=WARN # Reduce startup noise log4j.logger.org.springframework.beans.factory=WARN # Mule classes log4j.logger.org.mule=INFO # Your custom classes log4j.logger.com.taiping.esb=INFO