一个基于Mule的企业服务总线的案例(关于JMS)
面向服務架構的關鍵字之一就是ESB。以前很多廠商靠買消息服務器來提供集成交互的方案,然后出現了SOAP和REST。
早期的嘗試基本上都是通過定一個固定的消息格式,例如xml來讓各個系統交換。但是這些消息格式本身經常需要修訂,就給集成帶來了很大的麻煩。
最好的解決方案就是每個應用還是用自己支持的接口,例如EDI或者SOAP,然后構建一個可以集成各種結構的聚合器,每一個應用的接口就開發成聚合器的一個端口。這樣一個cobol寫的應用就可以和一個j2me的應用交互,而不需要知道彼此的技術細節。
常見ESB供應商比較
| Product | Vendor | Connects with... |
| Matrix BusinessWorks | TIBCO | SOAP, EMS, JMS, Rendezvous, MQ, BPEL |
| Mule ESB | Open-source, MuleSource, Inc. | SOAP, REST, JMS, MQ, JBI, AQ, Caching, JavaSpaces, GigaSpaces, Email, IM, JCA, AS400 Data Queues, System I/O. |
| OpenESB | Open-source, Sun Microsystems | JBI, JCA, JAX-RPC, JAX-WS |
| Sonic ESB | Progress Software | JMS, SOAP, JMX |
| Websphere ESB | IBM | JMS, MQ, SOAP; requires additional adapters to interface with other products and legacy protocols; requires Websphere to work |
這里少了一個ServiceMix。
下面是這個案例的細節:
本案例用到的程序包括:
- AMD-based 2.6 GHz 4 GB RAM, and Intel-based 3 GHz 4 GB RAM servers
- Solaris 10 and Ubuntu Linux Dapper Drake
- Java Run-time Environment 1.5.9
- Mule current general availability package
- A commercial JMS provider
- Commercial applications for order capture, inventory management, order management, fulfillment, and reporting
假設有一個項目要集成很多企業級應用程序,出于開發周期的壓力,我們選擇集成而非重新構建的策略。也就是說order capture, inventory management, order management, fulfillment, and reporting 這些都購買現成的廠商的,我們只需要集中開發一個內容管理系統。
通過和其它六家廠商的協商,他們都提供了JMS和SOAP的接口。因此我們需要一個專業的JMS服務器。
下面我們來看看配置文件:
<Mule-configuration id="Enterprise-Applications-Mashup" version="1.0"> 首先定義一個Mule和JMS交互的連接器,相當于一個連接池
? <connector name="jmsConnector" className="org.Mule.providers.jms.JmsConnector">
??? <properties>
????? <property name="jndiProviderUrl"
??????????????? value="bitjmsnaming://172.28.63.209:7222"/>
????? <property name="connectionFactoryJndiName"
??????????????? value="QueueConnectionFactory"/>
????? <map name="jndiProviderProperties">
??????? <property name="java.naming.factory.initial"
????????????????? value="com.bitco.bitjms.naming.bitjmsInitialContextFactory"/>
??????? <property name="java.naming.security.principal" value="admin"/>
??????? <property name="java.naming.security.credentials" value=""/>
????? </map>
????? <property name="username" value="admin"/>
????? <property name="password" value=""/>
??? </properties>
? </connector>
?? 然后定義一些端點,每個端點都是一個外部供應商程序的接口
? <global-endpoints>
??? <endpoint name="inJMSGTA"?????? address="jms://q.gta.in" connector="jmsConnector"/>
??? <endpoint name="inJMSSeebelle"? address="jms://q.seebelle.in" connector="jmsConnector"/>
??? <endpoint name="inJMSYenta"???? address="jms://q.yenta.in" connector="jmsConnector"/>
??? <endpoint name="inJMSCatwire"?? address="jms://q.catwire.in" connector="jmsConnector"/>
??? <endpoint name="inJMSBitco"???? address="jms://q.bitco.in" connector="jmsConnector"/>
??? <endpoint name="outJMSGTA"????? address="jms://q.gta.out" connector="jmsConnector"/>
??? <endpoint name="outJMSSeebelle" address="jms://q.seebelle.out" connector="jmsConnector"/>
??? <endpoint name="outJMSYenta"??? address="jms://q.yenta.out" connector="jmsConnector"/>
??? <endpoint name="outJMSCatwire"? address="jms://q.catwire.out" connector="jmsConnector"/>
??? <endpoint name="outJMSBitco"??? address="jms://q.bitco.out" connector="jmsConnector"/>
??? <endpoint name="console"??????? address="stream://System.out" />
? </global-endpoints>
? <transformers>
??? <transformer name="JMSMessageToObject"
???????????????? className="org.Mule.providers.jms.transformers.JMSMessageToObject" />
??? <transformer name="ObjectToString"
???????????????? className="org.Mule.transformers.simple.ObjectToString" />
? </transformers>
? <model name="Enterprise-Applications-Mashup-JMS">
??? <Mule-descriptor name="JMSMessageSwitchboard"
???? implementation="org.Mule.components.simple.PassThroughComponent">
系統只有一個inbound,也就是進入系統消息的定義,端口名稱叫做outJMSBitco,也就是說outJMSBitco發出一個指令,進入總線,然后Mule把這個消息轉換后發送給其它所有的outbound-router,離開總線,進入別的應用程序。
????? <inbound-router>
??????? <global-endpoint name="outJMSBitco"/>
????? </inbound-router>
????? <outbound-router match-all="true">
??????? <router className="org.Mule.routing.outbound.FilteringOutboundRouter">
????????? <global-endpoint name="inJMSYenta" />
????????? <filter className="org.Mule.samples.jms.JMSHeaderFilter"
????????????????? expression="OrderHistoryRequest" />
??????? </router>???????????? 以下面這條為例:
這條路由的意思是,將消息通過JMS發送給Siebel,JMS的頭要標上OrderHistoryResonse,這樣Siebel的消息隊列受到一條這個消息,Siebel知道對方要做什么操作,將OrderHistory查詢出來。
??????? <router className="org.Mule.routing.outbound.FilteringOutboundRouter">
????????? <global-endpoint name="inJMSSiebel" />
????????? <filter className="org.Mule.samples.jms.JMSHeaderFilter"
????????????????? expression="OrderHistoryResponse" />
??????? </router>????????????
??????? <router className="org.Mule.routing.outbound.FilteringOutboundRouter">
????????? <global-endpoint name="inJMSCatwire"/>
????????? <filter className="org.Mule.samples.jms.JMSHeaderFilter" expression="item" />
??????? </router>????????????
??????? <router className="org.Mule.routing.outbound.FilteringOutboundRouter">
????????? <global-endpoint name="inJMSCatwire"/>
????????? <filter className="org.Mule.samples.jms.JMSHeaderFilter" expression="item_mapping" />
??????? </router>????????????
??????? <router className="org.Mule.routing.outbound.FilteringOutboundRouter">
????????? <global-endpoint name="inJMSYenta"/>
????????? <filter className="org.Mule.samples.jms.JMSHeaderFilter" expression="PAMInventoryUpdate" />
??????? </router>????????????
??????? <router className="org.Mule.routing.outbound.FilteringOutboundRouter">
????????? <global-endpoint name="inJMSGTA" />
????????? <filter className="org.Mule.samples.jms.JMSHeaderFilter" expression="CustomerSearchRequest" />
??????? </router>????????????
??????? <router className="org.Mule.routing.outbound.FilteringOutboundRouter">
????????? <global-endpoint name="inJMSSiebel" />
????????? <filter className="org.Mule.samples.jms.JMSHeaderFilter" expression="CustomerSearchResponse" />
??????? </router>????????????
??????? <router className="org.Mule.routing.outbound.FilteringOutboundRouter">
????????? <global-endpoint name="inJMSYenta" />
????????? <filter className="org.Mule.samples.jms.JMSHeaderFilter" expression="OrderDetailsRequest" />
??????? </router>????????????
??????? <router className="org.Mule.routing.outbound.FilteringOutboundRouter">
????????? <global-endpoint name="inJMSSiebel" />
????????? <filter className="org.Mule.samples.jms.JMSHeaderFilter" expression="OrderDetailsResponse" />
??????? </router>????????????
??????? <router className="org.Mule.routing.outbound.FilteringOutboundRouter">
????????? <global-endpoint name="inJMSYenta" />
????????? <filter className="org.Mule.samples.jms.JMSHeaderFilter" expression="OrderAddUpdRequest" />
??????? </router>????????????
??????? <router className="org.Mule.routing.outbound.FilteringOutboundRouter">
????????? <global-endpoint name="inJMSSiebel" />
????????? <filter className="org.Mule.samples.jms.JMSHeaderFilter" expression="OrderAddUpdResponse" />
??????? </router>????????????
??????? <router className="org.Mule.routing.outbound.FilteringOutboundRouter">
????????? <global-endpoint name="inJMSYenta" />
????????? <filter className="org.Mule.samples.jms.JMSHeaderFilter" expression="catwireCreateItem" />
??????? </router>????????????
??????? <router className="org.Mule.routing.outbound.FilteringOutboundRouter">
????????? <global-endpoint name="inJMSGTA" />
????????? <filter className="org.Mule.samples.jms.JMSHeaderFilter" expression="catalogupdate" />
??????? </router>????????????
??????? <router className="org.Mule.routing.outbound.FilteringOutboundRouter">
????????? <global-endpoint name="inJMSGTA" />
????????? <filter className="org.Mule.samples.jms.JMSHeaderFilter" expression="productupdate" />
??????? </router>????????????
??????? <router className="org.Mule.routing.outbound.FilteringOutboundRouter">
????????? <global-endpoint name="inJMSGTA" />
????????? <filter className="org.Mule.samples.jms.JMSHeaderFilter" expression="skuupdate" />
??????? </router>????????????
??????? <router className="org.Mule.routing.outbound.FilteringOutboundRouter">
????????? <global-endpoint name="inJMSYenta" />
????????? <filter className="org.Mule.samples.jms.JMSHeaderFilter" expression="gtaCreateOrder" />
??????? </router>????????????
??????? <router className="org.Mule.routing.outbound.FilteringOutboundRouter">
????????? <global-endpoint name="inJMSYenta" />
????????? <filter className="org.Mule.samples.jms.JMSHeaderFilter" expression="gtaGetOrderDetails" />
??????? </router>????????????
??????? <router className="org.Mule.routing.outbound.FilteringOutboundRouter">
????????? <global-endpoint name="openJmsOutbound"/>
????????? <filter className="org.Mule.samples.jms.JMSHeaderFilter" expression="XXXOrderUpdate" />
??????? </router>????????????
??????? <router className="org.Mule.routing.outbound.FilteringOutboundRouter">
????????? <global-endpoint name="inJMSBitco"/>
????????? <filter className="org.Mule.samples.jms.JMSHeaderFilter" expression="OrderRelease" />
??????? </router>????????????
這個端口的意思是把消息打印在DOS窗口上
??????? <router className="org.Mule.routing.outbound.OutboundPassThroughRouter">
????????? <endpoint address="stream://System.out" transformers="ObjectToString" />
??????? </router>
????? </outbound-router>
??? </Mule-descriptor>
? </model>
</Mule-configuration>
總結
以上是生活随笔為你收集整理的一个基于Mule的企业服务总线的案例(关于JMS)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7怎么设置开机屏幕 Win7开机屏
- 下一篇: Mule的消息路由