一个基于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)相关推荐
- 教程 | 一个基于TensorFlow的简单故事生成案例:带你了解LSTM
在深度学习中,循环神经网络(RNN)是一系列善于从序列数据中学习的神经网络.由于对长期依赖问题的鲁棒性,长短期记忆(LSTM)是一类已经有实际应用的循环神经网络.现在已有大量关于 LSTM 的文章和文 ...
- ERP_基于Oracle SOA的企业服务总线整合
2015-01-01 Created By BaoXinjian 一.方案背景 随着企业信息化程度的不断提高,企业IT系统日趋庞大,跨系统流程以及各个系统之间.以及系统内部的接口需求和接口服务调用也不 ...
- 一个基于Web服务器的PoW区块链案例
一个基于web服务器的PoW案例 一.安装第三方库 go get github.com/davecgh/go-spew/spew 这个库的功能是在命令行格式化输出内容. go get github.c ...
- ESB(Enterprise Service Bus,即企业服务总线)
1. ESB架构之企业实施案例 : http://www.infoq.com/cn/articles/esb-enterprises-case 2. ESB(Enterprise Service Bu ...
- 企业服务总线--MuleESB简介
Mule译为:骡子.顽固的人.Mule是一个以java为基础的企业服务总线(ESB),该集成平台允许开发者在遵循SOA服务导向式架构方法学下快速便捷的将不同应用程序连接在一起交换数据.可以忽略各个应用 ...
- 当企业服务总线遇到云服务
转载本文需注明出处:微信公众号EAWorld,违者必究. 前言: 本文主要介绍企业服务总线的常见应用场景,与大家共同探讨在云环境.微服务中传统企业服务总线所面临的问题,结合普元企业服务总线产品向大家分 ...
- ESB(企业服务总线)相关知识点总结
目录 一.什么是ESB 二.ESB解决了什么问题以及什么是HSB 三.市面上 ESB产品有哪些?如何选择 四. 如何实现ESB的各个功能 1.ESB的服务接入方式? 2.ESB的如何进行协议转换? 3 ...
- 企业服务总线--解决方案剖析,第 1 部分: 企业服务总线的基本概念
转摘自:http://www.ibm.com/developerworks/cn/webservices/ws-esb1/ 本文作为ESB系列文章的第一篇,介绍了面向服务的体系结构(service-o ...
- 系统架构-企业服务总线(ESB)
ESB的基本概念 企业服务总线(EnterpriseServiceBus,ESB)从面向服务体系架构(Service-OrientedArchitecture,SOA)发展而来,是传统中间件技术与XM ...
最新文章
- 【ACM】杭电1073:Online Judge
- BZOJ1393 [Ceoi2008]knights
- 简单网络管理协议(SNMP)实现linux系统信息网络监控
- windows开启smnp服务
- 【ZOJ - 3703】Happy Programming Contest(带优先级的01背包,贪心背包)
- 逼急了自己人都坑,腾讯内部上演吃鸡大战
- java argument parse_snmp4j 之 ArgumentParser
- 数据-第13课-链表回顾
- 基于51单片机的指纹考勤系统
- python中idle环境的退出命令的快捷键_IDLE环境的退出命令是( )。_学小易找答案...
- ppt技巧一四步法调整段落排版
- Unity学习之生命周期函数
- 更新日志 - fir.im Jenkins Gradle 插件上线
- React 面试题 回答
- 腾讯笔试编程题,贪吃的小Q(二分查找)
- Google CardBoard SDK for Unity集成指南
- 在团体沙盘游戏实操中分析“自我、本我、超我”
- mysql md 123456_mysql/mysql.md · sdbxpjzq/docs - Gitee.com
- CCF201812-2 小明放学(JAVA)
- seo模拟点击软件_哪些SEO排名工具是有效的呢?
热门文章
- VTK:绘制轴AXES用法实战
- boost::multiprecision模块tommath相关的测试程序
- boost::hana::maybe用法的测试程序
- boost::hana::value_of用法的测试程序
- boost::graph模块实现Graphviz DOT 语言阅读器
- GDCM:独特的uid测试程序
- ITK:对给定LabelMap的所有LabelObject应用形态学关闭操作
- ITK:将内核与位置上的图像相乘
- DCMTK:使用dcmimage库将DICOM图像转换为PPM或PGM
- VTK:小部件之CaptionWidget