Mule 中很好的结合了spring,在 Mule 3.x 中将 spring 3.x 作为核心组件,可以开箱即用,和一般J2EE应用开发无异。下面介绍一下:
三. log4j
一. 属性占位(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
三. log4j
通过 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