- 浏览: 294103 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (133)
- boss好文 (10)
- 数据模型 (2)
- together (1)
- oracle (10)
- 健康生活 (4)
- js好东东 (8)
- 工作流 (1)
- 常见java问题 (7)
- BOSS开发随想 (0)
- rose相关 (1)
- 股市看图 (4)
- java基础 (12)
- jbpm (1)
- 集群(负载均衡) (4)
- spring教程 (2)
- maven入门 (5)
- 项目管理 (14)
- 常用软件 (3)
- mysql (4)
- j2ee性能调优 (2)
- jfreechart相关 (1)
- 需求工具 (2)
- maven基础讲解 (3)
- AXURE下载 (2)
- db2 (2)
- svn (1)
- 日常操作技巧 (3)
- SOA (16)
- jetty (2)
- jetspeed (0)
- camel (0)
- 安卓开发 (4)
- ESB (4)
- 物流 (2)
- 软件需求的3个层次 (1)
- WMS (1)
- eclipse (1)
- 安卓源代码 (2)
- jar (0)
最新评论
-
seeYourEye:
prt1979 写道怎么在点“open project”后,选 ...
PL/SQL Developer插件之SVN -
prt1979:
怎么在点“open project”后,选择文件夹后一直弹出“ ...
PL/SQL Developer插件之SVN -
houlianxue:
LateCHI 写道东西不错。可以正常打开目录。但是进行svn ...
PL/SQL Developer插件之SVN -
LateCHI:
东西不错。可以正常打开目录。但是进行svn操作的时候提示 un ...
PL/SQL Developer插件之SVN -
w.tany:
很多地方少个# 号
<s:property>的用法
Mule是开源的企业集成消息框架,,它的配置需要使用大量的XML文件,本文就对这些配置文件进行介绍,首先还是普及一下Mule基础常识。
什么是Mule?
Mule是一个透明的,基于Java的消息框架,它允许不同的应用程序连接,从而摆脱应用程序之间直接相互调用的情况,Mule支持多线程/消息模式(默认是阶段式事件驱动架构,SEDA),输入和输出到不同的传送器(email,文件,数据库等),以及通过协议如SOAP 发送到Web Service,如图1所示。
Mule没有要求要一个统一的消息格式,它允许在与不同服务相互操作时指定转换,Mule企业版支持多个商业消息系统,包括TIBCO Rendezvous和IBM WebSphere MQ。
它的架构采用了三层:应用层,集成层和传输层。Mule实现了企业服务总线(ESB),并为面向服务的架构(SOA)提供了一个平台。分层的方法提升了可复用性,如图2所示。
安装Mule
Mulesource.org网站上提供了两个Mule版本:
1、企业版(需购买许可,有商业化支持,可从http://www.mulesource.com/download/ee/下载试用版);
2、社区版(功能少一点,但是免费的)。
对于Mule 2.x版本,需要安装JDK 1.5(http://java.sun.com/javase/downloads/index_jdk5.jsp)和Ant 1.7.1(http://ant.apache.org/bindownload.cgi)或Maven 2.0.9(http://maven.apache.org/download.html)。
Mule使用入门指南在http://www.mulesource.org/display/MULE2INTRO/Offline+Documentation,如果开放工具使用的是Eclipse,最简单的办法是将classpath设置包括./lib/mule和./lib/opt目录下的所有.jar文件。
运行Mule
Mule可以嵌入到Java应用程序、应用程序服务器或Web应用程序中,要运行Mule,你必须指定一个配置文件,这个配置文件描述了Mule的各项配置参数,有多种方法启动Mule:
1、在命令提示符后
mule [-config ]
2、从一个脚本
org.mule.MuleServer -config mule-config.xml
//创建一个新的服务器,使用两个配置文件
MuleServer server = new MuleServer("mule-config1.xml,mule-config2.xml");
//启动服务器,布尔参数值确定了服务器是在一个新线程中启动还是就在当前的线程中启动
server.start(true);
3、通过指定配置生成器的全限定类名,如果不指定,Mule就使用默认值org.mule.config.builders.AutoConfigurationBuilder:
3、通过指定配置生成器的全限定类名,如果不指定,Mule就使用默认值org.mule.config.builders.AutoConfigurationBuilder:
4、通过分配一个具体的服务器ID与Mule环境交互:
AutoConfigurationBuilder configbuilder = new AutoConfigurationBuilder("C:/MuleConfDir/mule-config.xml");
DefaultMuleConfiguration muleConfig = new DefaultMuleConfiguration();
muleConfig.setId("MY_SERVER_ID_1");
MuleContextBuilder contextBuilder = new DefaultMuleContextBuilder();
contextBuilder.setMuleConfiguration(muleConfig);
MuleContext muleContext = new DefaultMuleContextFactory().createMuleContext(configbuilder, contextBuilder);
muleContext.start();
Mule组件
本节定义组成Mule消息框架的不同组件,并介绍如何用XML来配置这些组件,这里的讨论针对的是Mule 2.x版本。
服务组件
服务是Mule用于实施集成解决方案的主要元素,一个服务组件是一段实现了某些业务功能的代码,如图3所示。Mule的一个主要优点是服务组件可以是简单的没有预先存在外部接口的POJO(Plain Old Java Objects,简单Java对象),在Mule 1.x等早期版本中,服务组件被称为通用消息对象(universal message objects,UMO)。
Mule为任何服务器组件提供了可插拔的连接性,使用特定的Mule配置设置,定义服务的特定行为,把外部消息转换成服务组件函数的调用,并控制它的生命周期,配置这个转换的是一个XML文件(默认是mule-config.xml),这个文件指定了消息流,应该指向服务组件。
Mule消息
Mule中的消息完全是一个数据包,它可以在一个特定通道上或端点上应用程序之间发送,一个消息也相当于一个由外部事件触发的事件,如收到队列中的数据或一个文件被拷贝到某个目录中,你可以使用Mule客户端编程产生Mule消息。
服务端点
端点的功能相当于网关,或者说是连接服务组件到外部消息的通道,它可以位于本地也可以位于网络上,如图4所示,Mule可以被配置为在端点上拦截消息,如果需要,然后将消息进行转换,转换后再传递给服务组件。
服务可以使用不同的传输器来接收和发送消息,对服务将要使用的每种传输器,你可以使用一个独立的端点。
消息路由
消息路由控制组件如何接收消息,以及在处理后应该发送到何处去,入站路由控制服务如何处理入站消息(如,有选择地允许那些符合特定标准的消息),出站路由控制服务处理完消息后该将其发往何处(如,将其发送到接收者的列表,或将消息拆分,然后发送到不同的端点),如图5所示。
路由是和过滤器结合工作的,过滤器指定限制条件,只有符合条件的消息才能被路由到服务,并包括一个表达式从当前消息中提取信息。
传输器和连接器
传输器实质上就是数据运输工具,它使用特定的协议在应用程序之间运输消息,如图6所示。Mule支持多个标准的传输器(JMS,HTTP等),并可以通过扩展org.mule.transport.AbstractConnector创建自定义传输器。
转换器
数据转换是一种让迥然不同的组件之间可以相互理解对方的消息的技术,消息经历转换弥补了两个组件的数据表现之间的差异,Mule翻译器(也叫做转换器)是Java类,如图7所示。
Mule配置了大量的转换器,并允许你通过扩展AbstractTransformer创建专用的转换器。
服务可能被限制到本地网络或只能使用本地或私有的传输器,私有传输器不被外部应用程序支持,通过提供一个能够通过转换器转换和通过端点访问服务组件的消息框架,Mule为常见的intranet/Internet消息交换提供了一个组件服务。
使用Mule客户端
Mule客户端是一个为Java客户端从Mule服务器或其它应用程序接收或发送消息的简易接口,一般说来,消息是由外部事件触发的,如队列上接收到一个消息,或一个文件被拷贝到某个目录下。
通过在单元测试或负载测试中引入消息,Mule客户端可以帮助测试消息流,如果你在相同的类加载器中使用Mule客户端(如一个Web应用程序或单独的Mule),客户端将会访问服务器配置,例如,如果在你的服务器配置文件中定义了以下端点:
<http:endpoint host="192.168.0.1" port="80" path="/services" name="serviceEndpoint"/>
那么这个端点就可以被Mule客户端访问:
MuleClient client = new MuleClient();
client.dispatch("serviceEndpoint", dataObject, null);
如果你以独立模式运行Mule客户端,你要使用它自己的Mule XML文件进行配置:
MuleClient client = new MuleClient();
client.dispatch("serviceEndpoint", dataObject, null);
综合应用
Mule使用数据文件确定数据流,以及使用哪个组件、路由、传输器和转换器,如图8所示,端点定义了使用的传输器,下面是一个通过Mule应用程序的事件流:
1、客户端通过调用一个URL(如http://mycompany/order:8081)启动进程;
2、声明一个HTTP入站传输器,拿起消息并检查入站路由中指定的输入(这里就是URL字符串)是否需要进行转换;
3、如果需要转换,就会在消息上应用转换器,如HttpRequestToNameString转换器;
4、消息被发送到处理业务的服务组件;
5、Customer Data Service组件从数据库中检索顾客信息;
6、出站路由决定将服务组件的处理结果路由到何处,例如,出站路由可能会指定一个JMS端点,消息被推送到队列或主题上;
7、出站传输器拿起这个消息,检查是否需要转换,接收服务的入站路由接收消息,然后如步骤2那样开始继续处理消息。
图- 8 Mule中的数据流 使用mule-config.xml工作
Mule配置文件由以下标签组织成一颗XML元素树:
1、<model> -- 定义应用程序中的服务;
2、<service> -- 配置一个服务;
3、<description> -- 服务的描述内容;
4、<inbound> -- 配置入站路由,它们的端点以及入站转换器;
5、<outbound> -- 配置一个或多个出站路由,它们的端点以及出站转换器;
6、<async-reply> -- 配置一个异步应答路由,它用于异步请求/响应消息中;
7、<exception-strategy> -- 配置连接器或模型或服务上的错误处理策略。
下面是一个示例模型:
配置设置
将服务组件编织成一个应用程序是由配置文件来完成的,Mule的配置设置是由开发人员负责的,它们包括:
1、服务组件的声明;
2、哪个服务上的端点将接收消息;
3、将消息引入到服务组件之前使用哪个转换器;
4、出站端点上的消息下一步改流向哪里;
5、消息的路由信息将其发送到下一个服务组件。
声明服务组件
1、<component> -- Mule组件是通过指定实施类名配置的,Mule为组件接收的每个消息创建新的类实例,注意是一个特定的Java类而不是函数:
<component class="org.my.ServiceComponentImpl"/>
2、<pooled-component> -- Mule创建一批组件,共用组件配置,对象工厂创建一个单一的对象实例也可以指定:
<pooled-component class="org.my.ServiceComponentImpl"/>
<component>
<singleton-object class="org.my.ServiceComponentImpl"/>
</component>
3、<entry-point-resolver-set/> -- Mule可以创建一个入口点分解器基于消息负载情况动态选择调用的函数:
<component class="org.my.PrototypeObjectWithMyLifecycle">
<entry-point-resolver-set>
<array-entry-point-resolver/>
<callable-entry-point-resolver/>
</entry-point-resolver-set>
</component>
4、<callable-entry-point-resolver> -- 这个入口点分解器用于组件实现org.mule.api.lifecycle.Callable接口,组件可以实现Callable接口废除一切动态解决方案,并调用接口函数进行替代。
5、<custom-entry-point-resolver-set> -- 这个自定义入口点分解器可以和实现了org.mule.api.model.EntryPointResolverSet接口的类一起实施,为了准确地在你的端点上指定函数,你可以在端点上使用函数参数,如:
<ejb:endpoint host="localhost" port="1099" object="SomeService" method="remoteMethod"/>
6、Mule提供了多个简单有用的组件用于测试和初始化原型,如<log-component/>,它将所有接收到的消息输出到控制台中。
配置端点
1、<endpoint> -- 使用它声明一个全局范围的端点,在整个Mule应用程序中都可以使用,在一个服务中,"ref="用于引用全局端点:
<file:endpoint name="fileReader" reverseOrder="true" comparator="org.mule.transport.file.comparator.OlderFirstComparator"/>
......
<model>
<service name="Priority1">
<file:inbound-endpoint ref="fileReader" path="/var/prio1"/>
......
</service>
<service name="Priority2">
<file:inbound-endpoint ref="fileReader" path="/var/prio2"/>
......
</service>
</model>
2、<inbound-endpoint> -- 这是服务组件接收事件的通道,它包括使用的传输器,地址,路径或资源(任何有效的URI):
<inbound-endpoint address="udp://localhost:65432"/>
<inbound-endpoint address="jms://test.queue"/>
3、<outbound-endpoint> -- 这个是组件返回的数据被发送出去的通道
<outbound-endpoint address="smtp://user:secret@smtp.host"/>
<outbound-endpoint address="smtp://user:secret@smtp.host"/>
配置入站路由
1、<selective-consumer-router> -- 这个路由在入站消息上应用一个或多个过滤器,符合要求的消息被转送到组件。
<inbound>
<selective-consumer-router>
<mulexml:jxpath-filter expression="msg/header/resultcode = 'success'"/>
</selective-consumer-router>
<forwarding-catch-all-strategy>
<jms:endpoint topic="error.topic"/>
</forwarding-catch-all-strategy>
</inbound>
2、<idempotent-receiver-router> -- 这个路由通过检查入站消息的唯一性消息ID确保服务接收的消息是唯一性的,ID可以使用idExpression属性中定义的表达式生成。
<inbound>
<secure-hash-idempotent-receiver-router messageDigestAlgorithm="SHA26">
<simple-text-file-store directory="./idempotent"/>
</secure-hash-idempotent-receiver-router>
</inbound>
3、<secure-hash-idempotent-receiver> -- 这个路由通过计算消息内容的散列值确保服务接收到的消息的唯一性。
<inbound>
<secure-hash-idempotent-receiver-router messageDigestAlgorithm="SHA26">
<simple-text-file-store directory="./idempotent"/>
</secure-hash-idempotent-receiver-router>
</inbound>
配置出站路由
1、<filtering-router> -- 这个路由使用过滤器确定消息是否匹配特定的标准。
<outbound matchAll="true">
<filtering-router>
<endpoint address="jms://deposit.queue"/>
</filtering-router>
<filtering-router>
<jms:outbound-endpoint queue="large.deposit.queue"/>
<mulexml:jxpath-filter expression="deposit/amount >= 100000"/>
</filtering-router>
</outbound>
2、<pass-through-router> -- 这个路由匹配所有的消息,通过一个配置好的端点发送出去。
<outbound>
<pass-through-router>
<smtp:outbound-endpoint to="ross@muleumo.org"/>
</pass-through-router>
</outbound>
3、<static-recipient-list-router> -- 这个路由用于从单个端点发送相同的消息到多个端点,或实施消息属性或有效负载确定的下一个目的地的路由滑动行为。
<outbound>
<static-recipient-list-router>
<payload-type-filter expectedType="javax.jms.Message"/>
<recipients>
<spring:value>jms://orders.queue</spring:value>
<spring:value>jms://tracking.queue</spring:value>
</recipients>
</static-recipient-list-router>
</outbound>
配置传输器和连接器
你可以为传输器声明一个描述连接信息的端点URI的值。
<rmi:endpoint name="BadType" host="localhost" port="1099" object="MatchingUMO" method="reverseString"/>
<jms:inbound-endpoint queue="test.queue"/>
<ssl:endpoint name="clientEndpoint" host="localhost" port="60198" synchronous="true"/>
<quartz:endpoint name="qEP6" repeatCount="10" repeatInterval="1000" jobName="job"/>
同样,你可以使用<connector>元素定义一个连接器配置,Mule使用标准的组件,如Work Manager高效共享线程资源,并为线程使用提供更多控制,对于错误,你也要象事务行为一样声明一个异常策略。
<vm:connector name="VMConnector">
...
<default-connector-exception-strategy>
<vm:outbound-endpoint path="systemErrorHandler"/>
</default-connector-exception-strategy>
</vm:connector>
配置转换器
你可以配置一个本地或全局的转换器,本地转换器定义在端点上,而全局转换器是在需要的时候进行引用的,下面的代码定义了两个全局转换器:
<xm:xml-to-object-transformer name="XMLToExceptionBean" returnClass="org.mule.example.errorhandler.ExceptionBean"/>
<custom-transformer name="ExceptionBeanToErrorMessage" class="org.mule.example.errorhandler.ExceptionBeanToErrorMessage"
returnClass="org.mule.example.errorhandler.ErrorMessage"/>
<append-string-transformer>在现有的字符串上追加了一个字符串:
<append-string-transformer name="myAppender" message=" ... that's good to know!"/>
<xslt-transformer>通过XSLT处理XML负载:
<mulexml:xslt-transformer name="xslt" xslFile="./conf/xsl/cd-listing.xsl">
<mulexml:context-property key="title" value="#[header:ListTitle]"/>
<mulexml:context-property key="rating" value="#[header:ListRating]"/>
</mulexml:xslt-transformer>
小结
本文只讨论了Mule的基础内容,以及如何使用XML配置Mule组件,同样,作为一个SOA平台,Mule也提供了SOA治理(注册/仓库)设施,叫做Mule Galaxy,它也支持通过Mule HQ在企业中管理Mule部署
什么是Mule?
Mule是一个透明的,基于Java的消息框架,它允许不同的应用程序连接,从而摆脱应用程序之间直接相互调用的情况,Mule支持多线程/消息模式(默认是阶段式事件驱动架构,SEDA),输入和输出到不同的传送器(email,文件,数据库等),以及通过协议如SOAP 发送到Web Service,如图1所示。
图- 1 Mule支持多种协议
Mule没有要求要一个统一的消息格式,它允许在与不同服务相互操作时指定转换,Mule企业版支持多个商业消息系统,包括TIBCO Rendezvous和IBM WebSphere MQ。
它的架构采用了三层:应用层,集成层和传输层。Mule实现了企业服务总线(ESB),并为面向服务的架构(SOA)提供了一个平台。分层的方法提升了可复用性,如图2所示。
图- 2 分层的方法提升了可复用性
安装Mule
Mulesource.org网站上提供了两个Mule版本:
1、企业版(需购买许可,有商业化支持,可从http://www.mulesource.com/download/ee/下载试用版);
2、社区版(功能少一点,但是免费的)。
对于Mule 2.x版本,需要安装JDK 1.5(http://java.sun.com/javase/downloads/index_jdk5.jsp)和Ant 1.7.1(http://ant.apache.org/bindownload.cgi)或Maven 2.0.9(http://maven.apache.org/download.html)。
Mule使用入门指南在http://www.mulesource.org/display/MULE2INTRO/Offline+Documentation,如果开放工具使用的是Eclipse,最简单的办法是将classpath设置包括./lib/mule和./lib/opt目录下的所有.jar文件。
运行Mule
Mule可以嵌入到Java应用程序、应用程序服务器或Web应用程序中,要运行Mule,你必须指定一个配置文件,这个配置文件描述了Mule的各项配置参数,有多种方法启动Mule:
1、在命令提示符后
mule [-config ]
2、从一个脚本
org.mule.MuleServer -config mule-config.xml
//创建一个新的服务器,使用两个配置文件
MuleServer server = new MuleServer("mule-config1.xml,mule-config2.xml");
//启动服务器,布尔参数值确定了服务器是在一个新线程中启动还是就在当前的线程中启动
server.start(true);
3、通过指定配置生成器的全限定类名,如果不指定,Mule就使用默认值org.mule.config.builders.AutoConfigurationBuilder:
3、通过指定配置生成器的全限定类名,如果不指定,Mule就使用默认值org.mule.config.builders.AutoConfigurationBuilder:
4、通过分配一个具体的服务器ID与Mule环境交互:
AutoConfigurationBuilder configbuilder = new AutoConfigurationBuilder("C:/MuleConfDir/mule-config.xml");
DefaultMuleConfiguration muleConfig = new DefaultMuleConfiguration();
muleConfig.setId("MY_SERVER_ID_1");
MuleContextBuilder contextBuilder = new DefaultMuleContextBuilder();
contextBuilder.setMuleConfiguration(muleConfig);
MuleContext muleContext = new DefaultMuleContextFactory().createMuleContext(configbuilder, contextBuilder);
muleContext.start();
Mule组件
本节定义组成Mule消息框架的不同组件,并介绍如何用XML来配置这些组件,这里的讨论针对的是Mule 2.x版本。
服务组件
服务是Mule用于实施集成解决方案的主要元素,一个服务组件是一段实现了某些业务功能的代码,如图3所示。Mule的一个主要优点是服务组件可以是简单的没有预先存在外部接口的POJO(Plain Old Java Objects,简单Java对象),在Mule 1.x等早期版本中,服务组件被称为通用消息对象(universal message objects,UMO)。
图- 3 服务组件
Mule为任何服务器组件提供了可插拔的连接性,使用特定的Mule配置设置,定义服务的特定行为,把外部消息转换成服务组件函数的调用,并控制它的生命周期,配置这个转换的是一个XML文件(默认是mule-config.xml),这个文件指定了消息流,应该指向服务组件。
Mule消息
Mule中的消息完全是一个数据包,它可以在一个特定通道上或端点上应用程序之间发送,一个消息也相当于一个由外部事件触发的事件,如收到队列中的数据或一个文件被拷贝到某个目录中,你可以使用Mule客户端编程产生Mule消息。
服务端点
端点的功能相当于网关,或者说是连接服务组件到外部消息的通道,它可以位于本地也可以位于网络上,如图4所示,Mule可以被配置为在端点上拦截消息,如果需要,然后将消息进行转换,转换后再传递给服务组件。
图- 4 入站(Inbound)和出站(Outbound)端点
服务可以使用不同的传输器来接收和发送消息,对服务将要使用的每种传输器,你可以使用一个独立的端点。
消息路由
消息路由控制组件如何接收消息,以及在处理后应该发送到何处去,入站路由控制服务如何处理入站消息(如,有选择地允许那些符合特定标准的消息),出站路由控制服务处理完消息后该将其发往何处(如,将其发送到接收者的列表,或将消息拆分,然后发送到不同的端点),如图5所示。
图- 5 入站和出站路由
路由是和过滤器结合工作的,过滤器指定限制条件,只有符合条件的消息才能被路由到服务,并包括一个表达式从当前消息中提取信息。
传输器和连接器
传输器实质上就是数据运输工具,它使用特定的协议在应用程序之间运输消息,如图6所示。Mule支持多个标准的传输器(JMS,HTTP等),并可以通过扩展org.mule.transport.AbstractConnector创建自定义传输器。
图- 6 Mule提供的传输器
连接器表示特定传输器的配置,例如,JMS使用一个队列或一个主题来接收或发送数据,HTTP连接器使用一个端口来交换数据,具体的队列,主题和端口在连接器内部指定,连接器可以全局指定(为整个Mule应用程序)或在服务级本地指定。
转换器
数据转换是一种让迥然不同的组件之间可以相互理解对方的消息的技术,消息经历转换弥补了两个组件的数据表现之间的差异,Mule翻译器(也叫做转换器)是Java类,如图7所示。
图- 7 转换器翻译消息
转换的例子包括从一种XML消息转换成另一种XML格式,或将XML消息转换成Java对象,转换器用于将转换接收到的数据,然后以特定协议发送出去,如JMS传输器使用的ObjectToJMSMessage转换器。
Mule配置了大量的转换器,并允许你通过扩展AbstractTransformer创建专用的转换器。
服务可能被限制到本地网络或只能使用本地或私有的传输器,私有传输器不被外部应用程序支持,通过提供一个能够通过转换器转换和通过端点访问服务组件的消息框架,Mule为常见的intranet/Internet消息交换提供了一个组件服务。
使用Mule客户端
Mule客户端是一个为Java客户端从Mule服务器或其它应用程序接收或发送消息的简易接口,一般说来,消息是由外部事件触发的,如队列上接收到一个消息,或一个文件被拷贝到某个目录下。
通过在单元测试或负载测试中引入消息,Mule客户端可以帮助测试消息流,如果你在相同的类加载器中使用Mule客户端(如一个Web应用程序或单独的Mule),客户端将会访问服务器配置,例如,如果在你的服务器配置文件中定义了以下端点:
<http:endpoint host="192.168.0.1" port="80" path="/services" name="serviceEndpoint"/>
那么这个端点就可以被Mule客户端访问:
MuleClient client = new MuleClient();
client.dispatch("serviceEndpoint", dataObject, null);
如果你以独立模式运行Mule客户端,你要使用它自己的Mule XML文件进行配置:
MuleClient client = new MuleClient();
client.dispatch("serviceEndpoint", dataObject, null);
综合应用
Mule使用数据文件确定数据流,以及使用哪个组件、路由、传输器和转换器,如图8所示,端点定义了使用的传输器,下面是一个通过Mule应用程序的事件流:
1、客户端通过调用一个URL(如http://mycompany/order:8081)启动进程;
2、声明一个HTTP入站传输器,拿起消息并检查入站路由中指定的输入(这里就是URL字符串)是否需要进行转换;
3、如果需要转换,就会在消息上应用转换器,如HttpRequestToNameString转换器;
4、消息被发送到处理业务的服务组件;
5、Customer Data Service组件从数据库中检索顾客信息;
6、出站路由决定将服务组件的处理结果路由到何处,例如,出站路由可能会指定一个JMS端点,消息被推送到队列或主题上;
7、出站传输器拿起这个消息,检查是否需要转换,接收服务的入站路由接收消息,然后如步骤2那样开始继续处理消息。
图- 8 Mule中的数据流
Mule配置文件由以下标签组织成一颗XML元素树:
1、<model> -- 定义应用程序中的服务;
2、<service> -- 配置一个服务;
3、<description> -- 服务的描述内容;
4、<inbound> -- 配置入站路由,它们的端点以及入站转换器;
5、<outbound> -- 配置一个或多个出站路由,它们的端点以及出站转换器;
6、<async-reply> -- 配置一个异步应答路由,它用于异步请求/响应消息中;
7、<exception-strategy> -- 配置连接器或模型或服务上的错误处理策略。
下面是一个示例模型:
<mule> <model> <service name="GreeterUMO"> <inbound....> <filtering-router> .... </filtering-router> </inbound> <component..../> <outbound....> ....... </outbound> <default-service-exception-strategy> ..... </default-service-exception-strategy> </service> <service name="GreeterUMO2" initialState="stopped"> ... </service> </model>
配置设置
将服务组件编织成一个应用程序是由配置文件来完成的,Mule的配置设置是由开发人员负责的,它们包括:
1、服务组件的声明;
2、哪个服务上的端点将接收消息;
3、将消息引入到服务组件之前使用哪个转换器;
4、出站端点上的消息下一步改流向哪里;
5、消息的路由信息将其发送到下一个服务组件。
声明服务组件
1、<component> -- Mule组件是通过指定实施类名配置的,Mule为组件接收的每个消息创建新的类实例,注意是一个特定的Java类而不是函数:
<component class="org.my.ServiceComponentImpl"/>
2、<pooled-component> -- Mule创建一批组件,共用组件配置,对象工厂创建一个单一的对象实例也可以指定:
<pooled-component class="org.my.ServiceComponentImpl"/>
<component>
<singleton-object class="org.my.ServiceComponentImpl"/>
</component>
3、<entry-point-resolver-set/> -- Mule可以创建一个入口点分解器基于消息负载情况动态选择调用的函数:
<component class="org.my.PrototypeObjectWithMyLifecycle">
<entry-point-resolver-set>
<array-entry-point-resolver/>
<callable-entry-point-resolver/>
</entry-point-resolver-set>
</component>
4、<callable-entry-point-resolver> -- 这个入口点分解器用于组件实现org.mule.api.lifecycle.Callable接口,组件可以实现Callable接口废除一切动态解决方案,并调用接口函数进行替代。
5、<custom-entry-point-resolver-set> -- 这个自定义入口点分解器可以和实现了org.mule.api.model.EntryPointResolverSet接口的类一起实施,为了准确地在你的端点上指定函数,你可以在端点上使用函数参数,如:
<ejb:endpoint host="localhost" port="1099" object="SomeService" method="remoteMethod"/>
6、Mule提供了多个简单有用的组件用于测试和初始化原型,如<log-component/>,它将所有接收到的消息输出到控制台中。
配置端点
1、<endpoint> -- 使用它声明一个全局范围的端点,在整个Mule应用程序中都可以使用,在一个服务中,"ref="用于引用全局端点:
<file:endpoint name="fileReader" reverseOrder="true" comparator="org.mule.transport.file.comparator.OlderFirstComparator"/>
......
<model>
<service name="Priority1">
<file:inbound-endpoint ref="fileReader" path="/var/prio1"/>
......
</service>
<service name="Priority2">
<file:inbound-endpoint ref="fileReader" path="/var/prio2"/>
......
</service>
</model>
2、<inbound-endpoint> -- 这是服务组件接收事件的通道,它包括使用的传输器,地址,路径或资源(任何有效的URI):
<inbound-endpoint address="udp://localhost:65432"/>
<inbound-endpoint address="jms://test.queue"/>
3、<outbound-endpoint> -- 这个是组件返回的数据被发送出去的通道
<outbound-endpoint address="smtp://user:secret@smtp.host"/>
<outbound-endpoint address="smtp://user:secret@smtp.host"/>
配置入站路由
1、<selective-consumer-router> -- 这个路由在入站消息上应用一个或多个过滤器,符合要求的消息被转送到组件。
<inbound>
<selective-consumer-router>
<mulexml:jxpath-filter expression="msg/header/resultcode = 'success'"/>
</selective-consumer-router>
<forwarding-catch-all-strategy>
<jms:endpoint topic="error.topic"/>
</forwarding-catch-all-strategy>
</inbound>
2、<idempotent-receiver-router> -- 这个路由通过检查入站消息的唯一性消息ID确保服务接收的消息是唯一性的,ID可以使用idExpression属性中定义的表达式生成。
<inbound>
<secure-hash-idempotent-receiver-router messageDigestAlgorithm="SHA26">
<simple-text-file-store directory="./idempotent"/>
</secure-hash-idempotent-receiver-router>
</inbound>
3、<secure-hash-idempotent-receiver> -- 这个路由通过计算消息内容的散列值确保服务接收到的消息的唯一性。
<inbound>
<secure-hash-idempotent-receiver-router messageDigestAlgorithm="SHA26">
<simple-text-file-store directory="./idempotent"/>
</secure-hash-idempotent-receiver-router>
</inbound>
配置出站路由
1、<filtering-router> -- 这个路由使用过滤器确定消息是否匹配特定的标准。
<outbound matchAll="true">
<filtering-router>
<endpoint address="jms://deposit.queue"/>
</filtering-router>
<filtering-router>
<jms:outbound-endpoint queue="large.deposit.queue"/>
<mulexml:jxpath-filter expression="deposit/amount >= 100000"/>
</filtering-router>
</outbound>
2、<pass-through-router> -- 这个路由匹配所有的消息,通过一个配置好的端点发送出去。
<outbound>
<pass-through-router>
<smtp:outbound-endpoint to="ross@muleumo.org"/>
</pass-through-router>
</outbound>
3、<static-recipient-list-router> -- 这个路由用于从单个端点发送相同的消息到多个端点,或实施消息属性或有效负载确定的下一个目的地的路由滑动行为。
<outbound>
<static-recipient-list-router>
<payload-type-filter expectedType="javax.jms.Message"/>
<recipients>
<spring:value>jms://orders.queue</spring:value>
<spring:value>jms://tracking.queue</spring:value>
</recipients>
</static-recipient-list-router>
</outbound>
配置传输器和连接器
你可以为传输器声明一个描述连接信息的端点URI的值。
<rmi:endpoint name="BadType" host="localhost" port="1099" object="MatchingUMO" method="reverseString"/>
<jms:inbound-endpoint queue="test.queue"/>
<ssl:endpoint name="clientEndpoint" host="localhost" port="60198" synchronous="true"/>
<quartz:endpoint name="qEP6" repeatCount="10" repeatInterval="1000" jobName="job"/>
同样,你可以使用<connector>元素定义一个连接器配置,Mule使用标准的组件,如Work Manager高效共享线程资源,并为线程使用提供更多控制,对于错误,你也要象事务行为一样声明一个异常策略。
<vm:connector name="VMConnector">
...
<default-connector-exception-strategy>
<vm:outbound-endpoint path="systemErrorHandler"/>
</default-connector-exception-strategy>
</vm:connector>
配置转换器
你可以配置一个本地或全局的转换器,本地转换器定义在端点上,而全局转换器是在需要的时候进行引用的,下面的代码定义了两个全局转换器:
<xm:xml-to-object-transformer name="XMLToExceptionBean" returnClass="org.mule.example.errorhandler.ExceptionBean"/>
<custom-transformer name="ExceptionBeanToErrorMessage" class="org.mule.example.errorhandler.ExceptionBeanToErrorMessage"
returnClass="org.mule.example.errorhandler.ErrorMessage"/>
<append-string-transformer>在现有的字符串上追加了一个字符串:
<append-string-transformer name="myAppender" message=" ... that's good to know!"/>
<xslt-transformer>通过XSLT处理XML负载:
<mulexml:xslt-transformer name="xslt" xslFile="./conf/xsl/cd-listing.xsl">
<mulexml:context-property key="title" value="#[header:ListTitle]"/>
<mulexml:context-property key="rating" value="#[header:ListRating]"/>
</mulexml:xslt-transformer>
小结
本文只讨论了Mule的基础内容,以及如何使用XML配置Mule组件,同样,作为一个SOA平台,Mule也提供了SOA治理(注册/仓库)设施,叫做Mule Galaxy,它也支持通过Mule HQ在企业中管理Mule部署
发表评论
-
BPEL或ESB:应该使用哪一个?
2012-03-13 17:09 1206在设计 SOA 解决方案时 ... -
ESB 案例解析和项目实施经验分享,第 3 部分: ESB 项目需求分析和方案设计浅谈
2012-02-15 14:50 1772选自:http://www.ibm.com/developer ... -
ESB 案例解析和项目实施经验分享,第 2 部分: 刚柔相济,构建企业联邦 ESB
2012-02-15 14:37 1861摘自:http://www.ibm.com/developer ... -
ESB案例分析:第 1 部分: 借助 ESB 整合航空公司商务体系,提升客户服务水平
2012-02-15 14:14 1937摘自:http://www.ibm.com/developer ... -
ESB架构之企业实施案例
2012-02-14 17:33 1415本文是摘抄自: http://www.webspherechi ... -
关于mule的网站
2011-11-07 10:17 1286关于mule的网站 1,http://note.sdo.com ... -
muleStudio发布到指定目录下
2011-11-04 15:14 1121在mule studio中右键项目名称,选择EXPORT,在弹 ... -
mule配置常用节点
2011-11-03 09:09 12501 Mule-config.xml 示例模型: <mul ... -
mule & seda 学习四
2011-11-03 09:10 983从前,从前 程序跑的太慢,对mule有点误解 jaxb解析 ... -
mule & seda的学习三
2011-11-03 09:10 1236以竣工服务为例 package com.tydic.mule ... -
mule & seda 学习二
2011-11-03 09:11 1186mule的jdbc,配置seda以及vm的初步认识 java ... -
mule & seda的学习之一
2011-11-02 17:18 1304mule:轻量级的ESB消息框架,可以和spring集成,支持 ... -
一个不错的MULE主文件
2011-11-02 17:06 1972mule & seda 的使用每分钟处理5000单,发 ... -
mule示例分析
2011-11-02 14:55 7005一、Hello World (主要演示了两个service c ... -
Mule 官方例子研究
2011-10-28 14:26 1916Mule 官方例子研究 一、 ...
相关推荐
基于微信小程序的在线办公小程序答辩PPT.pptx
这个数据集来自世界卫生组织(WHO),包含了2000年至2015年期间193个国家的预期寿命和相关健康因素的数据。它提供了一个全面的视角,用于分析影响全球人口预期寿命的多种因素。数据集涵盖了从婴儿死亡率、GDP、BMI到免疫接种覆盖率等多个维度,为研究者提供了丰富的信息来探索和预测预期寿命。 该数据集的特点在于其跨国家的比较性,使得研究者能够识别出不同国家之间预期寿命的差异,并分析这些差异背后的原因。数据集包含22个特征列和2938行数据,涉及的变量被分为几个大类:免疫相关因素、死亡因素、经济因素和社会因素。这些数据不仅有助于了解全球健康趋势,还可以辅助制定公共卫生政策和社会福利计划。 数据集的处理包括对缺失值的处理、数据类型转换以及去重等步骤,以确保数据的准确性和可靠性。研究者可以使用这个数据集来探索如教育、健康习惯、生活方式等因素如何影响人们的寿命,以及不同国家的经济发展水平如何与预期寿命相关联。此外,数据集还可以用于预测模型的构建,通过回归分析等统计方法来预测预期寿命。 总的来说,这个数据集是研究全球健康和预期寿命变化的宝贵资源,它不仅提供了历史数据,还为未来的研究和政策制
基于微信小程序的“健康早知道”微信小程序答辩PPT.pptx
基于微信小程序的电影交流平台答辩PPT.pptx
计算机字符编码GB18030
Hive 操作基础(进阶版)多级分区数据文件2
基于java的贫困生管理系统答辩PPT.pptx
pandas whl安装包,对应各个python版本和系统(具体看资源名字),找准自己对应的下载即可! 下载后解压出来是已.whl为后缀的安装包,进入终端,直接pip install pandas-xxx.whl即可,非常方便。 再也不用担心pip联网下载网络超时,各种安装不成功的问题。
TA_lib库(whl轮子),直接pip install安装即可,下载即用,非常方便,各个python版本对应的都有。 使用方法: 1、下载下来解压; 2、确保有python环境,命令行进入终端,cd到whl存放的目录,直接输入pip install TA_lib-xxxx.whl就可以安装,等待安装成功,即可使用! 优点:无需C++环境编译,下载即用,方便
本压缩包资源说明,你现在往下拉可以看到压缩包内容目录 我是批量上传的基于SpringBoot+Vue的项目,所以描述都一样;有源码有数据库脚本,系统都是测试过可运行的,看文件名即可区分项目~ |Java|SpringBoot|Vue|前后端分离| 开发语言:Java 框架:SpringBoot,Vue JDK版本:JDK1.8 数据库:MySQL 5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat 开发软件: idea/eclipse(推荐idea) Maven包:Maven3.3.9+ 系统环境:Windows/Mac
tornado-6.2b2.tar.gz
javawe论坛项目 原生技术
tornado-6.2b1-cp310-cp310-macosx_10_9_universal2.whl
随着物流行业的快速发展,货运管理变得愈发重要。为了提高货运效率,确保货物安全,我们开发了这款基于司机信用评价的货运管理系统。 该系统主要包含了货物信息管理、订单评价管理、货主管理等多个功能模块。在货物信息管理模块中,用户可以查看和管理货物的详细信息,包括货物名称、规格、装车状态、运输状态以及卸货状态等,方便用户随时掌握货物的动态。 订单评价管理模块是该系统的核心之一,它允许货主对司机的服务进行评价,系统会根据评价数据对司机进行信用评分。这一功能不仅有助于提升司机的服务质量,还能为货主提供更加可靠的货运选择。 此外,货主管理模块提供了货主信息的录入、修改和查询等功能,方便用户管理自己的货主资料。系统界面简洁明了,以蓝色为主色调,设计现代且专业,为用户提供了良好的使用体验。 通过该系统,用户可以轻松实现货物信息的查看和管理,对司机的服务进行评价,提高货运效率和服务质量。同时,系统也为司机提供了一个展示自我、提升信用的平台,有助于推动物流行业的健康发展。
毕业生交流学习平台 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B
基于java的广场舞团答辩PPT.pptx
基于java的基于SSM的校园音乐平台答辩PPT.pptx
Jira插件安装包
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
tornado-6.2b2-cp37-abi3-win_amd64.whl