`
逆风的香1314
  • 浏览: 1431410 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一个基于Mule的企业服务总线的案例

阅读更多

原文地址: http://www.theserverside.com/tt/articles/article.tss?l=CaseStudyMule

面向服务架构的关键字之一就是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> 

    分享到:
    评论

    相关推荐

      EIP经典案例ESB实践之Mule实现.rar_eip_esb_mule_mule esb

      Mule ESB是MuleSoft公司推出的一款开源企业服务总线软件,它是EIP的一种实现方式。Mule ESB以其高效、灵活和易于使用的特性,被广泛应用于各种集成项目中。Mule ESB支持多种协议和标准,如HTTP、JMS、FTP、SOAP、...

      mule in action

      《Mule in Action》是一本专注于Mule ESB(企业服务总线)的入门教程,旨在帮助读者系统地学习和理解这一强大的集成平台。Mule ESB是开源领域中的一个重量级选手,常用于构建灵活、可扩展的企业级集成解决方案。这...

      mule in action mule 实战

      Mule in Action是一本关于Mule ESB(企业服务总线)的实战指南,旨在为读者提供深入的实践知识和案例分析。ESB作为一种流行的中间件技术,用于实现不同系统之间的服务集成。Mule作为一个开源的ESB解决方案,通过其...

      EIP经典案例ESB实践之Mule实现

      Mule ESB(Enterprise Service Bus,企业服务总线)是一种流行的开源集成平台,用于构建灵活、可扩展的企业级应用程序。在本文中,我们将深入探讨Mule ESB在实现EIP(Enterprise Integration Patterns,企业集成模式...

      MuleESB3.0中文教程

      ### MuleESB3.0中文教程知识点梳理 #### 一、Mule ESB 3.0概述 - **定位**:Mule ESB 3.0是一款轻量级的消息框架和整合...无论是对于初学者还是高级用户,Mule ESB 3.0都提供了一个强大且灵活的企业服务总线解决方案。

      Mule ESB开发工具以及相匹配的英文手册和中文手册(翻译狗充值翻译)

      Anypoint Studio 是 Mule ESB 的官方开发工具,它是基于 Eclipse 的一个强大IDE,专为构建基于Mule的应用而设计。Anypoint Studio 提供了图形化的工作流设计界面,使得开发者可以通过拖拽组件来创建和配置Mule应用...

      Mule in Action 2014

      Mule ESB (Enterprise Service Bus) 是一款非常流行的开源企业服务总线工具,由MuleSoft公司开发并维护。它允许开发者轻松地集成不同的应用程序和服务,并提供了一系列强大的功能来处理消息传递、数据转换、事务管理...

      Mule ESB cookbook

      《Mule ESB Cookbook》是一本专注于Mule ESB(Enterprise Service Bus)实践应用的书籍,旨在帮助读者深入理解和熟练运用这一强大的企业级服务总线。Mule ESB是一款开源的集成平台,专为简化应用程序之间的数据交换...

      EIP经典案例ESB实践

      4. **Mule ESB**:压缩包内的文档"**EIP经典案例ESB实践之Mule实现.doc**"可能详细介绍了Mule ESB的使用,MuleSoft的Mule ESB是一个开源的ESB实现,以其易用性和高性能闻名。它提供了丰富的连接器库,支持与各种系统...

      mule esb cookbook

      《Mule ESB Cookbook》是一本专注于Mule ESB(Enterprise Service Bus,企业服务总线)实战技巧的书籍。Mule ESB是Anypoint Platform的一部分,由MuleSoft公司开发,是一个开源的企业级集成平台,用于构建连接应用...

      mule-2.1.1-users-guide

      Mule是一款强大的企业级服务总线(Enterprise Service Bus, ESB),它支持各种集成模式和传输协议,使得数据能够在不同的应用程序和服务之间进行高效传递。 ### Mule 2.1.1 用户指南概览 Mule 2.1.1用户指南主要...

      Apress - Mule 2 Developer’s Guide to ESB and Integration Platform.pdf

      本章通过一个实际案例来介绍如何使用 Mule 进行应用建模。 **真实世界场景:** - **机场行李处理系统:** 分析了如何设计和实现一个复杂的行李处理流程。 **建模步骤:** 1. **需求分析:** 明确业务需求和技术挑战。 ...

      Open-Source ESBs in Action

      **“Open-Source ESBs in Action”** 这一标题清晰地表明了本书的主题是关于开源企业服务总线(Enterprise Service Bus, ESB)的实际应用案例。企业服务总线是一种用于支持和服务于企业级集成项目的软件架构模式。...

      基于OpenESB的SOA实践

      基于OpenESB的SOA(面向服务架构)实践是一个深入探讨如何利用OpenESB企业服务总线实现SOA设计的专业指南。SOA是一种设计模式,它将应用程序的不同功能单元通过服务接口联系起来,这些功能单元可以由不同的系统或...

      基于SOA技术的软件开发视频

      此外,Spring框架可以用来管理和协调服务间的交互,而Mule ESB作为企业服务总线,能有效地连接和集成不同的服务。 **视频学习内容概述** "基于SOA技术的软件开发视频"可能涵盖了以下主题: 1. **SOA基础概念**:...

      Guide to Enterprise Integration

      9. 继承解决方案目录:DZone的研究指南提供了一个全面的解决方案目录,用于比较市场上最流行的消息队列、集成框架、ESB、iPaaS解决方案和API管理平台。这为企业在选择集成解决方案时提供了参考和比较的依据。 10. ...

      soap-rest-attachments:如何在 Mule ESB 中通过 SOAP 和 REST 调用处理附件的 E2E 示例

      在本文中,我们将深入探讨如何在 Mule ESB(企业服务总线)环境中,通过 SOAP 和 REST 调用来处理附件。Mule ESB 是一个强大的集成平台,它允许开发者轻松地连接各种系统,实现数据交换。在这个具体的案例中,我们将...

      开源ESB实践

      在现代企业架构中,企业服务总线(Enterprise Service Bus,简称ESB)扮演着非常重要的角色。ESB的出现,使得企业内部不同的服务和系统能够通过统一的方式进行通信和交互,降低了系统的复杂性和维护成本。随着开源...

    Global site tag (gtag.js) - Google Analytics