资源描述
Mule学习笔记
作者:郑先全
msn:zhengxianquan@
1. 原理
请参考《Using JBI for Service-Oriented Integration (SOI)》
2. Mule介绍
2.1. 架构
2.2. 核心概念
请参考《Architecture Guid》
2.3. repository
如果想保持新鲜,访问他们的CVS是最好的办法。
cvs -d :pserver:anonymous@cvs.mule.codehaus.org:/scm/mule login
(no password)
cvs -d :pserver:anonymous@cvs.mule.codehaus.org:/scm/mule co mule
注意:从2006年4月14日开始,不再使用cvs,而采用svn,路径如下:
https://svn.codehaus.org/mule
2.4. IDE
有自己的IDE:
Download:
http://docs.codehaus.org/display/MULE/Download
Eclipse update site:
http://dist.codehaus.org/mule/muleide/updates/
3. Mule使用
3.1. Mule的安装
我的JDK为1.4.2_05。
下载后,解压缩,并设置MULE_HOME为解压缩目录
测试:
提供的echo例子程序是个比较好的测试工具,放在%MULE_HOME%\samples\echo下,cmd并切换到改目录的bin下,执行mule-echo.bat,即可看到如下窗口:
恭喜,说明安装成功。
Tip:
事实上,在我的环境中会提示一个关于缺少一个sax文件的错误,郁闷,通过到sax王张并下载sax2r3.zip后,把里面的xml-apis.jar解压缩到%MULE_HOME%\lib下,可以解决该问题。
3.2. echo例子分析
参考这个地址(http://mule.codehaus.org/Echo+Example)的介绍,应该会有一个比较好的开始。
3.2.1. 过程图示
描述为:
1、 通过两种方式接入(红色标识):一为System.in,另一为Soap(http)方式;
2、 每种接入都可以通过接入器(Connector)经过NMR路由转发后,进行输出,目前通过两种方式输出:一为System.out,另一为Soap(http)方式
可以通过Mule提供的工具生成配置图,如下:
3.2.2. 相关代码(The Echo Service)
The echo Service is a POJO that implements an EchoService interface -
public interface EchoService {
public String echo(String echo);
}
The implementation (i.e the POJO to be managed by Mule) looks like -
package ponents.simple;
public class EchoComponent extends LogComponent implements EchoService {
public String echo(String echo) {
return echo;
}
}
3.2.3. 配置和说明
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mule-configuration PUBLIC "-//SymphonySoft //DTD mule-configuration XML V1.0//EN"
"
<!--整体配置-->
<mule-configuration id="Mule_Echo_Sample" version="1.0">
<!--配置描述-->
<description>描述</description>
<!--连接器配置-->
<connector name="SystemStreamConnector" className="org.mule.providers.stream.SystemStreamConnector">
<properties>
<property name="promptMessage" value="Please enter something: "/>
<property name="messageDelayTime" value="1000"/>
</properties>
</connector>
<!--模型配置-->
<model name="echoSample">
<mule-descriptor name="EchoUMO" implementation="ponents.simple.EchoComponent">
<!—接入点设置,目前为stream和axis两种类型-->
<inbound-router>
<endpoint address="stream://System.in"/>
<endpoint address="axis:http://localhost:8081/services"/>
</inbound-router>
<!—输出点设置,目前为stream类型-->
<outbound-router>
<router className="org.mule.routing.outbound.OutboundPassThroughRouter">
<endpoint address="stream://System.out"/>
</router>
</outbound-router>
</mule-descriptor>
</model>
</mule-configuration>
3.3. Webapp例子分析
这个例子其实是对原有几个例子在webapp的集成,通过使用MuleClient进行基于编码的调用。
Tips:
1、 可以通过干预web.xml,逐个加载需要揣摩的例子,便于分析;
2、 开始时,使用默认的加载方式。
3.3.1. echo例子
略
3.3.2. Hello例子
3.3.2.1. 介绍
本例子主要用于演示两个transformer、两个UMO之间的信息转换和事件交互。
Transformer:
StringToNameString
Transformer:
NameStringToChatString
GreeterUMO
ChitChatUMO
3.3.2.2. 代码分析
几个java文件,说明如下:
POJO/javabean:
NameString.java
ChatString.java
SERVICE:
Greeter.java
ChitChatter.java
Transformer:
HttpRequestToString.java
NameStringToChatString.java
StringToNameString.java
ChatStringToString.java
3.3.2.3. 配置
Web.xml
<param-value>/WEB-INF/mule-config.xml,
/WEB-INF/mule-echo-config.xml,
/WEB-INF/mule-hello-config.xml
</param-value>
Mule-hello-config.xml
<!--转换器à
<transformers>
<transformer name="StringToNameString"
className="org.mule.samples.hello.StringToNameString"
returnClass="org.mule.samples.hello.NameString"/>
<transformer name="NameStringToChatString"
className="org.mule.samples.hello.NameStringToChatString"
returnClass="org.mule.samples.hello.ChatString"/>
</transformers>
<!--
A Mule descriptor defines all the necessary information about how your components will
interact with the framework, other components in the system and external sources.
Please refer to the Configuration Guide for a full description of all the parameters.
-->
<mule-descriptor name="GreeterUMO" implementation="org.mule.samples.hello.Greeter">
<inbound-router>
<endpoint address="vm://greeter" transformers="StringToNameString"/>
<endpoint address="servlet://greeter" transformers="StringToNameString"/>
</inbound-router>
<outbound-router>
<router className="org.mule.routing.outbound.OutboundPassThroughRouter">
<endpoint address="vm://chitchatter"/>
</router>
</outbound-router>
</mule-descriptor>
<mule-descriptor name="ChitChatUMO" implementation="org.mule.samples.hello.ChitChatter">
<inbound-router>
<endpoint address="vm://chitchatter" transformers="NameStringToChatString"/>
</inbound-router>
</mule-descriptor>
Tips:
1、 endpoint 的address并没有实际的意义,但由于在整个Mule实例里面必须唯一,故可以理解为命名空间
2、 Transformer必须继承AbstractTransformer,主要实现doTransform接口方法
3.3.3. loanbroker
3.3.3.1. 介绍
异步实现:
同步实现:
3.3.3.2. 配置图
请参考:http://mule.codehaus.org/Loan+Broker+Example
3.3.3.3. 类图
3.3.3.4. 配置文件详细分析
<mule-configuration id="Loan_broker_Sync" version="1.0">
<!—定义EndPointà
<endpoint-identifiers>
<endpoint-identifier name="LoanBrokerRequests" value="vm://LoanBrokerRequests"/>
<endpoint-identifier name="LoanBrokerQuotes" value="vm://LoanQuotes"/>
<endpoint-identifier name="CreditAgency" value="axis:http://localhost:18080/mule/CreditAgencyService?method=getCreditProfile"/>
<endpoint-identifier name="CreditAgencyReceiver" value="axis:http://localhost:18080/mule"/>
<endpoint-identifier name="LenderService" value="vm://localhost/LenderService?method=setLenderList"/>
<!-- The method parameter for the bank endpoints is added programmitcally when the bank objects are
created -->
<endpoint-identifier name="Bank1" value="axis:http://localhost:10080/mule"/>
<endpoint-identifier name="Bank2" value="axis:http://localhost:20080/mule"/>
<endpoint-identifier name="Bank3" value="axis:http://localhost:30080/mule"/>
<endpoint-identifier name="Bank4" value="axis:http://localhost:40080/mule"/>
<endpoint-identifier name="Bank5" value="axis:http://localhost:50080/mule"/>
</endpoint-identifiers>
<!-- LoanBroker Descriptorà
<mule-descriptor name="LoanBroker"
implementation="org.mule.samples.loanbroker.SyncLoanBroker">//说明这个类来发出请求而已,并不需要实现特殊接口
<inbound-router>
<endpoint address="LoanBrokerRequests"/>
</inbound-router>
<outbound-router>// LoanBroker Descriptor有两个outbound,一个去访问信用代理,一个去获取贷款方列表
<router className="org.mule.routing.outbound.FilteringOutboundRouter">
<endpoint address="CreditAgency"/>
<filter expectedType="org.mule.samples.loanbroker.Customer" className="org.mule.routing.filters.PayloadTypeFilter"/>
//信用代理,注意使用了filter,是为了确保CreditAgency的EndPoint对应的CreditAgencyService具有合适的参数
</router>
<router className="org.mule.routing.outbound.FilteringOutboundRouter">
<endpoint address="LenderService"/>
<filter expectedType="org.mule.samples.loanbroker.BankQuoteRequest" className="org.mule.routing.filters.PayloadTypeFilter"/>
//贷款方代理,通过filter,使得只有类型为BankQuoteRequest的请求去访问
</router>
</outbound-router>
<response-router timeout="100000">//响应路由,通过聚合进行
<endpoint address="LoanBrokerQuotes"/>
<router className="org.mule.samples.loanbroker.routers.BankQuotesResponseAggregator"/>
</response-router>
</mule-descriptor>
<mule-descriptor name="CreditAgencyService"//默认获取用户信用信息的服务
inboundEndpoint="CreditAgencyReceiver"
implementation="org.mule.samples.loanbroker.DefaultCreditAgencyService">
</mule-descriptor>
<mule-descriptor name="LenderService"//借贷方服务
inboundEndpoint="LenderService"
implementation="org.mule.samples.loanbroker.DefaultLenderService">
<outbound-router>
<router className="org.mule.routing.outbound.StaticRecipientList">
<reply-to address="LoanBrokerQuotes"/>//reply-to描述了反馈的端点
<filter expression="recipients!=null" className="org.mule.routing.filters.MessagePropertyFilter"/>
//这个过滤器的用处在于说明只有recipients!=null的情况下,才执行必要的逻辑
</router>
</outbound-router>
</mule-descriptor>
<!—下面为几个银行的inbound配置,主要描述几个不同银行的输入à
<mule-descriptor name="Bank1"
inboundEndpoint="Bank1"
implementation="org.mule.samples.loanbroker.Bank">
</mule-descriptor>
<mule-descriptor name="Bank2"
inboundEndpoint="Bank2"
implementation="org.mule.samples.loanbroker.Bank">
</mule-descriptor>
<mule-descriptor name="Bank3"
inboundEndpoint="Bank3"
implementation="org.mule.samples.loanbroker.Bank">
</mule-descriptor>
<mule-descriptor name="Bank4"
inboundEndpoint="Bank4"
implementation="org.mule.samples.loanbroker.Bank">
</mule-descriptor>
<mule-descriptor name="Bank5"
inboundEndpoint="Bank5"
implementation="org.mule.samples.loanbroker.Bank">
</mule-descriptor>
</mule-configuration>
3.3.3.5. 通过ActiveMQ进行
上述例子是通过Axis1.3构造webservice进行的,很容易通过ActiveMQ来做,主要的调整只要重新定义Enpoint即可。
具体配置文件修改一下即可,如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mule-configuration PUBLIC "-//SymphonySoft //DTD mule-configuration XML V1.0//EN"
"
<mule-configuration id="Loan_broker_ASync" version="1.0">
<mule-environment-properties synchronous="false" serverUrl="" remoteSync="false"/>
<!--Testing with ActiveMq-->
<!--
<connector name="jmsConnector" className="org.mule.providers.jms.JmsConnector">
<properties>
<property name="connectionFactoryJndiName" value="ConnectionFactory"/>
<property name="jndiInitialFactory" value="org.activemq.jndi.ActiveMQInitialContextFactory"/>
<property name="specification" value="1.1"/>
<map name="connectionFactoryProperties">
<property name="brokerURL" value="tcp://localhost:61616"/>
</map>
</properties>
</connector>-->
<connector name="jmsConnector" className="org.mule.providers.jms.JmsConnector">
<properties>
<property name="specification" value="1.1"/>
<property name="connectionFactoryJndiName" value="ConnectionFactory"/>
<property name="jndiInitialFactory" value="org.activemq.jndi.ActiveMQInitialContextFactory"/>
<map name="connectionFactoryProperties">
<property name="brokerURL" value="vm://localhost"/>
<property name="brokerXmlConfig"
value="classpath:/activemq-config.xml"/>
</map>
</properties>
</connector>
<!-- testing with OpenJms -->
<!--<connector name="jmsConnector" className="org.mule.providers.jms.JmsConnector">-->
<!--<properties>-->
<!--<property name="connectionFactoryJndiName" value="JmsQueueConnectionFactory"/>-->
<!--<property name="jndiInitialFactory" value="org.exolab.jms.jndi.InitialContextFactory"/>-->
<!--<property name="jndiProviderUrl" value="tcp://localhost:3035"/>-->
<!--</properties>-->
<!--</connector>-->
<endpoint-identifiers>
<endpoint-identifier name="LoanBrokerRequests" value="vm://LoanBrokerRequests"/>
<endpoint-identifier name="LoanBrokerQuotes" value="jms://LoanQuotes"/>
<endpoint-identifier name="CreditAgency" value="jms://CreditAgencyService"/>
<endpoint-identifier name="CreditAgencyReceiver" value="jms://CreditAgencyReceiver"/>
<endpoint-identifier name="LenderService" value="jms://LenderService"/>
<endpoint-identifier name="Bank1" value="jms://Bank1"/>
<endpoint-identifier name="Bank2" value="jms://Bank2"/>
<endpoint-identifier name="Bank3" value="jms://Bank3"/>
<endpoint-identifier name="Bank4" value="jms://Bank4"/>
<endpoint-identifier name="Bank5" value="jms://Bank5"/>
</endpoint-identifiers>
<mule-descriptor name="LoanBroker"
implementation="org.mule.samples.loanbroker.AsyncLoanBroker">
<inbound-router>
<endpoint address="LoanBrokerRequests"/>
</inbound-router>
<outbound-router>
<router className="org.mule.routing.outbound.FilteringOutboundRouter">
<endpoint address="CreditAgency"/>
<filter expectedType="org.mule.samples.loanbroker.Customer" className="org.mule.routing.filters.PayloadTypeFilter"/>
</router>
<router className="org.mule.routing.outbound.FilteringOutboundRouter">
<endpoint address="LenderService"/>
<filter expectedType="org.mule.samples.loanbroker.BankQuoteRequest" className="org.mule.routing.filters.PayloadTypeFilter"/>
</router>
</outbound-router>
<response-router timeout="100000">
<endpoint address="LoanBrokerQuotes"/>
<router className="org.mule.samples.loanbroker.routers.BankQuotesResponseAggregator"/>
</response-router>
</mule-descriptor>
<mule-descriptor name="CreditAgencyService"
inboundEndpoint="CreditAgencyReceiver"
implementation="org.mule.samples.loanbroker.DefaultCreditAgencyService">
</mule-descriptor>
<mule-descriptor name="LenderService"
inboundEndpoint="LenderService"
implementation="org.mule.samples.loanbroker.DefaultLenderService">
<outbound-router>
<router className="org.mule.routing.outbound.StaticRecipientList">
<reply-to address="LoanBrokerQuotes"/>
<filter expression="recipients!=null" className="org.mule.routing.filters.MessagePropertyFilter"/>
</router>
</outbound-router>
</mule-descriptor>
<mule-descriptor name="Bank1"
inboundEndpoint="Bank1"
implementation="org.mule.samples.loanbroker.Bank">
</mule-descriptor>
<mule-descriptor name="Bank2"
inboundEndpoint="Bank2"
implementation="org.mule.samples.loanbroker.Bank">
</mule-descriptor>
<mule-desc
展开阅读全文