资源描述
Mule学习笔记
作者:郑先全
msn:
1. 原理
请参照《Using JBI for Service-Oriented Integration (SOI)》
2. Mule简介
2.1. 架构
2.2. 核心概念
请参照《Architecture Guid》
2.3. repository
如果想保持新鲜,访问她们CVS是最佳办法。
cvs -d :pserver::/scm/mule login
(no password)
cvs -d :pserver::/scm/mule co mule
注意:从4月14日开始,不再使用cvs,而采用svn,途径如下:
2.4. IDE
有自己IDE:
Download:
Eclipse update site:
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例子分析
参照这个地址(+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. 配备图
请参照:+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:0/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,是为了保证CreditAgencyEndPoint相应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-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.l
展开阅读全文