分类存档: ESB

Apache Servicemix 教程 – EIP基础

有段时间没写这系列文章了,今天“心血来潮”写上一篇.

EIP即Enterprise Information Portal. 是ESB领域一个比较重要的概念,事实上不单单是ESB, EIP可以用在很多地方,相对于BPEL更加底层. 关于EIP有一款非常著名的开源产品,也是apache顶级项目之一 Apache Camel http://camel.apache.org/  这里Servicemix对Camel也有专门的JBI封装,并且Servicemix也很推荐使用Apache Camel作为其EIP.

EIP的范畴太大(我水平也有限),我们这里只讲在Servicemix里的EIP.  推荐一部EIP经典之作,《Enterprise Integration Patterns 》构架师必备宝典之一. 涵盖了EIP所有的设计模型.Apache Camel就是几乎对这本书所讲到的模型都做了实现.堪称经典中的经典.

本章作为基础,不想扯到Apache Camel上去,只对servicemix自带的eip进行讲解.熟悉以后可以轻松过渡到Apache Camel中去.

开始之前,请确认了解XML相关知识,如Xquery、Xpath、命名空间等. 不了解朋友请先在W3C网站上学习相关知识. http://www.w3school.com.cn/x.asp

打开servicemix-eip文档,可看到其支持的11种路由方式. 就一般应用而已也是足够的了.

Content-Based Router 消息内容路由
Message Filter 消息过滤
Pipeline in-only –> in-out 消息桥接.
Static Recipient List 多目的消息路由,即one consumer 到 multi provider
Static Routing Slip 静态路由规则. 即设定路由线路.使其按照线路一步步走下去
Wire Tap 消息监听路由
XPath Splitter 消息分割路由.即把单一消息切割成多个消息
Aggregator 消息聚合路由.即上面的反过来
Content Enricher 内容再造路由.消息通过此路由可以进行一些额外的交互,比如数据库
Resequencer 消息重组.即把多条散列数据重组
AsyncBridge in-out –> in-only 消息桥接.

上表简单对路由功能进行概述. 常用的是这几个路由

  1. Content-Based Router
  2. Static Recipient List
  3. Wire Tap
  4. Aggregator
  5. XPath Splitter

稍微对上面几个常用路由的运用场景进行解释和介绍,更多路由可以购买或下载上面提到的《Enterprise Integration Patterns 》一书.

一、Content-Based Route

最经典的一个路由,基于一个消息的内容的不同,把消息路由到不同的端口上去.

eg. 创建一个客户,ESB接受到客户信息数据后,可以判断客户的级别,把不同级别的客户发往不同的服务提供者上去.

二、Static Recipient List

静态的设定当ESB收到一个条数据后,同时发给多个服务提供者.

eg. 电信前台CRM创建一个客户账户的时候,这个客户信息同事要传递给计费系统BSS又要传递给施工系统OSS,同事建立起客户基本信息.

三、Wire Tap

消息监听模式,当一条消息不管采用in-only还是in-out通过时,都可以对消息进行监听,此过程是异步的.

eg. 做消息监听日志

四、Aggregator

把多条数据聚合后送往一个服务提供者. 多用于复杂数据交互场景. 适用于异步模式.

eg. 银行查询一个人账户的信誉等级. 同时向多家机构发出查询请求, 多家机构对结果通过ESB设置的规则,统一汇总后返回. 比如A机构给出的评价是10分, B机构给出的评价是6分. 通过聚合处理后,可以同事把A和B的评价接收,而不是单独的接收每个系统的数据.

五、Xpath Splitter

消息切割,可以把一个消息按照某种规则,切割成多个小片段的数据.

eg.  一个新系统要采购一个书包名单,往往是发出一个书包名单的集合,而如果目标是一个老系统,接口每次只能处理一本书时,在不改变2个系统接口上,通过配置消息切割路由,在ESB把多本数据切割成单本书,一次传递给老系统.

 

下一章会实例讲解下EIP的配置.

Apache Servicemix 教程 – GET/POST传递

   这几天在南京出差,参与一个华为巴西的POC演示项目. 涉及到CRM,OSS,BSS,BA等多个生产系统. 原先项目采用WebLogic作为中间件(浙江电信自己的中间件,部署在Weblogic)上.由于该中间件的局限性,其他系统SOAP传递有点问题, 因此对方简易使用别的ESB产品,已便于支撑项目能够完成.

   CRM系统是把浙江电信CRM完全移植,采用sieble7. 可能是时代的局限性, sieble7还不支持soap消息的传递,而是使用一种特定结构的xml,通过post方式传递到外部系统. 最新的sieble8应该不会有这个问题.

   然而,阅读Servicemix文档,可以发现Servicemix并没有直接的HTTP Post/Get的Binding Component. 然后自己观察就可以发现,Servicemix提供了HTTP Binding Compoent组件, 而POST/GET方式正式最基本的HTTP提交方式. 因此完全可以用HTTP Bingding Compoent支持这点.

HTTP Binding Compoent    http://servicemix.apache.org/servicemix-http.html

  阅读HTTP Binding Compoent的文档.并没有找到那里有设置GET/POST参数的地方, 而POST/GET传递方式,最基本的一点是必须要有一个参数作为载体,然后通过这个载体传递到服务端.

  继续翻文档,翻Mail List,终于找到servicemix有个相似的例子: Http Upload

   使用HTTPMarshaler完全可以解决我们的需求.

Http 配置


				xmlns:http="http://servicemix.apache.org/http/1.0"

				xmlns:novaesb="http://www.fengsage.com/novaesb"

				xmlns="http://www.springframework.org/schema/beans"

				xmlns:xsi="http://http://www.w3.org/2001/XMLSchema-instance"

				xsi:schemaLocation="http://servicemix.apache.org/http/1.0 http://servicemix.apache.org/schema/servicemix-http-3.2.3.xsd

				http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

				service="novaesb:httplistener"

				endpoint="listenerEndpoint"

				locationURI="http://0.0.0.0:8192/query/"

				defaultMep="http://www.w3.org/2004/08/wsdl/in-out"

				targetService="novaesb:CustomerTarget"

				marshaler="#marshaler" />

				id="marshaler" class="com.fengsage.novaesb.HTTPMarshaler" />

				

com.fengsage.novaesb.HTTPMarshaler代码


				/*

				* To change this template, choose Tools | Templates

				* and open the template in the editor.

				*/

				package com.fengsage.novaesb;

				import javax.jbi.component.ComponentContext;

				import javax.jbi.messaging.MessageExchange;

				import javax.jbi.messaging.MessagingException;

				import javax.jbi.messaging.NormalizedMessage;

				import javax.servlet.http.HttpServletRequest;

				import javax.servlet.http.HttpServletResponse;

				import org.apache.log4j.Logger;

				import org.apache.servicemix.http.endpoints.DefaultHttpConsumerMarshaler;

				import org.apache.servicemix.jbi.jaxp.StringSource;

				/**

				* HTTP protocal POST/GET

				* @author Fred

				*/

				public class HTTPMarshaler extends DefaultHttpConsumerMarshaler{

				private static final Logger logger = Logger.getLogger(HTTPMarshaler.class);

				public MessageExchange createExchange(HttpServletRequest req, ComponentContext context) throws Exception {

				String request = req.getParameter("request");

				logger.info("******"+request);

				MessageExchange me = context.getDeliveryChannel().createExchangeFactory().createExchange(getDefaultMep());

				NormalizedMessage in = me.createMessage();

				if (request != null) {

				in.setContent(new StringSource(this.wappedJBI(request)));

				} else {

				in.setContent(new StringSource(this.wappedJBI("null")));

				}

				me.setMessage(in, "in");

				return me;

				}

				public static String wappedJBI(String xml){

				String head = " "

				+ "

				+ "xmlns:xsd="http://www.w3.org/2001/XMLSchema" "

				+ "xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0"";

				String body = ""+xml+"";

				String end = "";

				return head+body+end;

				}

				public void sendOut(MessageExchange exchange, NormalizedMessage outMsg, HttpServletRequest request,

				HttpServletResponse response) throws Exception {

				response.getOutputStream().print("11111111111111111");

				}

				}

 

~Over~

Apache Servicemix 教程 – CXFSE

前面我们讲了Servicemix最常用的组件之一CXFBC的使用,几乎常见的接口开发都会用到,这里我们介绍CXFSE,从名字上可以看到这是一个SE组件.属于JBI内部的数据处理单元.

SE 即 Service Enging 服务引擎,JBI一个重要概念,基本概念参考此处 

从官网上我们可以看到下面几个特征

  • JSR-181 annotations
  • JAXB2/Aegis/XMLBeans databinding
  • WSDL auto generation
  • Java proxy support
  • MTOM / attachments support

我们关心最后2个,其实这几个都属于WebService或CXF框架本身的范畴,这里因为Servicemix用到了CXF所以这些特征也带了,想获得详细特性的请访问CXF官网.

其实简单来说,CXFSE最主要的功能是用代码发布一个WSDL,但是,这个WSDL是在JBI容器内的,不对外的,因为CXFSE是一个SE组件而非BC组件,根据JBI规范,不能用于协议转换.

CXFBC+CXFSE 可以做到在Servicemix容器内发布自己的Webservice. 虽然这种做法比较少见,因为Servicemix主要把现有的系统集成,而不是自己发布服务.

一、Java Proxy

官网上这句话解释的非常清楚,‘You can create java proxies for JBI endpoints, provided that they expose a WSDL.’

要理解这句话,首先要明白一件事,即JBI内部用来描述一个服务,也是采用了WSDL规范,这不能说是JBI就是WSDL规范,只能说是JBI用了WSDL规范来描述自身的服务.因此这里我们可以很显性的把一个JBI的组件向外暴露出WSDL,通过CXF-BC直接暴露给外部.当然一般业务角度上来说,这是危险的.

二、MTOM Support

CXF支持MTOM,Servicemix没理由不支持,只需按如下申明即可

<cxfse:endpoint mtomEnabled="true" ... />

结合上面说的一对P话,我们来实际做一个例子,即Servicemix发布一个服务,该服务允许上传附件,即用到了CXFBC+CXFSE+MTOM这些.

待续…

Apache Servicemix 教程 – CXFBC

主要介绍下Servicemix最常用的组件之一servicemix cxfbc的使用,官方上有比较详细的文档,英文好的朋友可以直接点击查看

  CXF 同时也是apache的一款webserivce框架.Java开发者可以使用cxf快速的发布webserivce或者作为客户端调用别的webserivce.

  在Java世界里,webserivce本质上就是把java bean对象序列化成xml文本,并包装成SOAP格式的消息传递到服务端,由服务端反序列化xml消息到java bean调用相关服务.

Note:这里的序列化和反序列化,涉及到2个标准,即jax-rpc和jax-ws规范 这2个规范无论是对SOAP的格式还是java-xml间互转都有着本质上的不同.JDK1.5以后,sun已经把jax-rpc移除了jdk中去. JDK1.5开始都采用jax-ws规范. 这里cxf同样只支持jax-ws规范.

  我们先来写一个简单的webservice程序,充当集成的一个系统,我们称这个系统为mock系统. 如何开发一个webserivce不是这里的重点,可以点击此处下载已开发完好的webservice程序,只需把war包扔到Servlet容器内部署即可. 这里我们假设我需要集成一个订单受理系统.

  浏览器内输入 http://localhost:8000/mock/services/order?wsdl   打开如下图,则启动正常

TM截图未命名

好了,我们开始对这个mock系统进行集成,因为是例子,我做的尽量简单,只使用cxfbc一个JBI组件来开发,现实环境中一般还用上xslt作为数据树结构转换,这里我们先不用.

一、编写自定义WSDL,

  CXFBC是一个BC组件,简单来说其实是一个WebService的代理组件,使用这个组件我可以不写任何一行代码,来和一个现有的WebService进行连接,虽然不用写代码,但我们却需要编写一个WSDL文件,这样ESB暴露给别的系统的就是这份WSDL文件,调用后CXFBC组件会把这份WSDL产生的SOAP消息,发往外部系统,这里是我们的mock系统.

大致关系如下:   
Client   — soap –>   ServiceMix(Custom WSDL) – soap – > mock

这里为了演示,我就自己不写WSDL了,直接把mock发布的WDSL拷贝一份即可,但要注意修改几个地方,参考下面WSDL.

 

XML语言: 临时自用代码
<?xml version=”1.0″ ?><wsdl:definitions name=“OrderServerImplService” targetNamespace=“http://www.fengsage.com/order” xmlns:ns1=“http://cxf.apache.org/bindings/xformat” xmlns:soap=“http://schemas.xmlsoap.org/wsdl/soap/” xmlns:tns=“http://www.fengsage.com/order” xmlns:wsdl=“http://schemas.xmlsoap.org/wsdl/” xmlns:xsd=“http://www.w3.org/2001/XMLSchema”>
  <wsdl:types>
<xs:schema attributeFormDefault=“unqualified” elementFormDefault=“unqualified” targetNamespace=“http://www.fengsage.com/order” xmlns=“http://www.fengsage.com/order” xmlns:xs=“http://www.w3.org/2001/XMLSchema”>
<xs:complexType name=“orderDetail”>
<xs:sequence>
<xs:element name=“id” type=“xs:long”></xs:element>
<xs:element minOccurs=“0” name=“name” type=“xs:string”></xs:element>
<xs:element name=“nums” type=“xs:int”></xs:element>
<xs:element minOccurs=“0” name=“remark” type=“xs:string”></xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name=“orderResult”>
<xs:sequence>
<xs:element name=“id” type=“xs:long”></xs:element>
<xs:element minOccurs=“0” name=“name” type=“xs:string”></xs:element>
<xs:element minOccurs=“0” name=“status” type=“xs:string”></xs:element>

</xs:sequence>
</xs:complexType>
<xs:element name=“create” nillable=“true” type=“orderDetail”></xs:element>
<xs:element name=“createResponse” nillable=“true” type=“orderResult”></xs:element>
</xs:schema>
  </wsdl:types>
  <wsdl:message name=“create”>
    <wsdl:part element=“tns:create” name=“create”>
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name=“createResponse”>

    <wsdl:part element=“tns:createResponse” name=“createResponse”>
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name=“OrderMockServer”>
    <wsdl:operation name=“create”>
      <wsdl:input message=“tns:create” name=“create”>
    </wsdl:input>
      <wsdl:output message=“tns:createResponse” name=“createResponse”>
    </wsdl:output>

    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name=“OrderServerImplServiceSoapBinding” type=“tns:OrderMockServer”>
    <soap:binding style=“document” transport=“http://schemas.xmlsoap.org/soap/http”></soap:binding>
    <wsdl:operation name=“create”>
      <soap:operation soapAction=“” style=“document”></soap:operation>
      <wsdl:input name=“create”>
        <soap:body use=“literal”></soap:body>
      </wsdl:input>

      <wsdl:output name=“createResponse”>
        <soap:body use=“literal”></soap:body>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name=“OrderServerImplService”>
    <wsdl:port binding=“tns:OrderServerImplServiceSoapBinding” name=“OrderMockEndPointPort”>
      <soap:address location=“http://localhost:8000/mock/services/order”></soap:address>
    </wsdl:port>

  </wsdl:service>
</wsdl:definitions>

 

注意<wsdl:service name=”OrderServerImplService” 和 <wsdl:port name=”OrderMockEndPointPort” 我们要修改成如下:

XML语言: 临时自用代码
<wsdl:service name=“OrderServerESBService”>
  <wsdl:port binding=“tns:OrderServerImplServiceSoapBinding” name=“OrderESBEndPointPort”>
    <soap:address location=“http://localhost:8000/mock/services/order”></soap:address>
  </wsdl:port>
</wsdl:service>

由于对Servicemix来说,外部系统(mock),也是一个endpoint,所以这里service name和endpoint name不能和外部系统一致,改成不同即可.

二、建立Servicemix工程

  这里使用maven脚本建立.

  1) 创建ROOT目录

C: mvn archetype:create -DarchetypeArtifactId=servicemix-project-root -DarchetypeGroupId=org.apache.servicemix.tooling -DartifactId=Root -DgroupId=com.fengsage.esb

2) 创建CXFBC组件

C:Root>mvn archetype:create -DarchetypeArtifactId=servicemix-cxf-bc-service-unit -DarchetypeGroupId
=org.apache.servicemix.tooling -DartifactId=cxfbc -DgroupId=com.fengsage.esb

3) 把前面自定义的WSDL文件放到srcmainresources 系统classpath 路径下

4) 编辑CXFBC组件的xbean.xml

XML语言: 临时自用代码
<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=“http://www.springframework.org/schema/beans”
       xmlns:cxfbc=“http://servicemix.apache.org/cxfbc/1.0”
       xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
       xmlns:esb=http://www.fengsage.com/order
       xsi:schemaLocation=“http://servicemix.apache.org/cxfbc/1.0 http://servicemix.apache.org/schema/servicemix-cxfbc-3.2.3.xsd
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd”>
  
  <cxfbc:consumer wsdl=“classpath:custom.wsdl”
                service=“esb:OrderServerESBService”
            endpoint=“OrderMockEndPointPort”
                  locationURI=“http://localhost:8193/ESB/1”
            targetService=“esb:OrderServerImplService”
                  targetEndpoint=“OrderMockEndPointPort”/>

  <cxfbc:provider wsdl=“http://localhost:8000/mock/services/order?wsdl”
                service=“esb:OrderServerImplService”
                  endpoint=“OrderMockEndPointPort”/> 
</beans>

5) 创建SA组件,进行打包

C:Root>mvn archetype:create -DarchetypeArtifactId=servicemix-service-assembly -DarchetypeGroupId=or
g.apache.servicemix.tooling -DartifactId=sa -DgroupId=com.fengsage.esb

6) 手动调整SA组件里的POM文件,添加下面几行,通知SA编译时把CXFBC组件打包进去

<dependency>
  <groupId>com.fengsage.esb</groupId>
  <artifactId>cxfbc</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>

7) 编译

C:Root>mvn install

8) 发布

  进入SAtarget目录,可以看到有个生成的sa-1.0-SNAPSHOT.jar文件把这个文件放到ApacheService的hotdeploy目录,启动Servicemix即可.或运行下面命令可以直接发布

C:Rootsa>mvn jbi:projectDeploy -o

如无错误,应该有下面提示

INFO  – ServerImpl                     – Setting the server’s publish address to be http://localhost
:8193/ESB/1

10) 打开http://localhost:8193/ESB/1?wsdl 进行浏览,可以看到这个就是我们在ESB发布的WebService了

11) 测试

  我们使用一款免费的WebService测试工具, SOAP UI , 官方地址

<soapenv:Envelope xmlns:soapenv=”http://schemas.xmlsoap.org/soap/envelope/” xmlns:ord=”http://www.fengsage.com/order”>
   <soapenv:Header/>
   <soapenv:Body>
      <ord:create>
         <id>?</id>
         <!–Optional:–>
         <name>?</name>
         <nums>?</nums>
         <!–Optional:–>
         <remark>?</remark>
      </ord:create>
   </soapenv:Body>
</soapenv:Envelope>

Apache Servicemix 教程 – 安装部署

简单介绍下Servicemix安装、使用、部署,并简单介绍下Servicemix简单配置.

安装

  1. 下载Servicemix  http://servicemix.apache.org/download.html 由linux和windows两个不同版本
  2. 解压到指定文件夹(zip/tar.gz)

Note:目前最新版本是3.3.2 和 4.0.0

运行

  1. cd <SERVICEMIX_HOME>
  2. windows:   .binservicemix.bat
    linux:          ./bin/servicemix

Note:由于linux启动servicemix,会随终端退出而关闭,需要使用nohup命令,使其脱离终端独立运行

部署

Servicemix提供2种主要监控方式

  1. 热部署目录. 即把开发好的SA直接放到<SERVICEMIX_HOME>hotdeploy目录中去即可
  2. 脚本部署. Servicemix运行使用ant或maven脚本方式,直接把开发好的SA植入到JBI容器内

Note:Servicemix提供了部署MBena,用户可以使用此MBean开发第三方程序进行部署

监控

Servicemix并没有提供第三方监控工具,而是推荐使用sun的jconsole工具,该工具位于JDK bin目录中和java
、javac等命令在一个目录下,操作如下

  1. 命令行输入jconsole
  2. 在远处连接处输入”service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi”  默认用户名和密码都是smx
  3. 点击”连接”按钮即可对Serivicemix内部资源进行监控

Note:Servicemix的第三方生产商FUSE提供了HQ监控工具,但是由于不开源,所以大家无福消受了.

 

关于开发

官方推荐使用maven作为Servicemix的开发工具,个人也强烈推荐,简单方便.详细的maven教程可以参考maven官方网站.http://maven.apache.org/

这里简单讲一下如何建立一个Servicemix工程,后面实例中讲详细介绍

  1. 创建一个root工程
    mvn archetype:create -DarchetypeArtifactId=servicemix-project-root -DarchetypeGroupId=org.apache.servicemix.tooling -DartifactId=Root -DgroupId=com.fengsage.esb
  2. 创建任意SU组件,各个组件对应的maven id 都可以从下面网址中得到
    http://mvnrepository.com/artifact/org.apache.servicemix.tooling
  3. 创建SA组件,对于每个servicemix工程,都需要打包成SA文件才能部署到JBI容器中去.
    mvn archetype:create -DarchetypeArtifactId=servicemix-service-assembly -DarchetypeGroupId=org.apache.servicemix.tooling -DartifactId=Root -DgroupId=com.fengsage.esb
  4. 编译,在root目录下,输入maven install 或 maven clear install 即可完成编译
  5. 打开编译后的*sa文件夹,找到target文件夹,里面有个*.jar文件即使我们打包后得到的SA文件,部署到servicemix容器中即可.

Apache Servicemix 教程 – 介绍及理论

经过一年来ESB学习和工作的部分经验.即给自己总结的时间,把脑海中关于ESB的部分进行整理,也留下点心得,也想和对ESB感兴趣,有研究的朋友进行交流.不足之处望予以批评指正.

基础概念

1. ESB

ESB(Enterprise Service Bus)是为了解决企业生态群落内大量系统间因为交互繁琐导致维护成本增加而产生的.下图是典型的传统多系统间数据交互图.随着生态群落的扩大,越来越多的系统加入,导致维护这些系统的通讯成本越来越多

clip_image002[4]

ESB的诞生就是为了解决上图中的这些问题,下图可以可以看到ESB所解决的实际问题.

clip_image004[4]

2. Apache Servicemix

Apache是著名的开源社区,正对不同应用都有很多对应的开源产品,对开源有兴趣的朋友可以进入官网学习. 对于ESB. Apache主要有2款产品: Synapse 和 Servicemix

  1. Synapse,这款产品是apache早期的一款ESB产品,诞生于JBI规范制定之前,属于众多ESB产品中一个普通的产品,并没有什么太吸引人的地方. 但随着WSO2这款新ESB的兴起,发生了点改变.WSO2是WSO2公司正对Synapse进行二次开发后的产物,因为使用了apache licese因此也开源.并且提供了强大的可视化界面,通过几步简单的配置就能完成系统间接口的集成.
  2. ServiceMix,我们重点讲这款产品.这款产品是目前Apache主推的一款ESB产品,遵循了JBI规范,可以很方便的进行二次扩展,其自带的组件基本能完成一般系统集成的需要,是构建SOA的良好产品.目前Servicemix主要有2个版本在维护,即3.*和4.*两个版本,这里我们讲3.*版本.

3. Apache CXF

目前比较成熟功能比较齐全的webserivce工具.可以用来发布自己的webserice程序,并能作为webserivce的客户端. Servicemix使用cxf作为其webserivce的一个发布工具.

4. Apache Camel

Apache Camel是一个开源的企业应用集成框架。它采用URI来描述各种组件,这样你可以很方便地与各种传输或者消息模块进行交互,比如HTTP、 ActiveMQ、JMS、JBI、SCA、MINA或CXF Bus API。该路由完全参照了《Enterprise Integration Patterns》一书中各种路由模式的规则. Servicemix使用camel作为其核心消息路由器.

5.  Apache derby

Apache一款文件型数据库,可以方便的内嵌到任意程序中去,也可以以内存作为数据库存储.比较适合开发系统初期使用. Servicemix用来对一些NMR消息的记录.

6.  Apache activemq

ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

7.  JBI

Sun用来规范ESB领域而制定的一个规范,当然目前遵守这一规范的ESB产品不多,Servicemix算是其中一个良民.
Servicemix从本质上来说就是一个JBI的容器,任何符合JBI规范的组件都可以放到这个容器里,成为Servicemix的一部分.JBI协议是smx里的重点,简单来说JBI协议分为下面几部分.

  1. Bind Component(BC) 即消息绑定组件,用于对不同消息进行转换.把收到的各种消息统一转换为JBI消息.也把JBI消息转换成各种协议发往外部系统.eg:
    servicemix-file                 IO组件,允许对把IO文件传入Servicemix
    servicemix-ftp                 支持FTP协议,允许使用FTP上文件传入Servicemix
    servicemix-http               支持Http协议,允许通过Http接受文件
    servicemix-jms                支持JMS协议,允许接受JMS消息
    servicemix-xmpp             支持XMPP协议,允许实时同步消息
    servicemix-cxfbc             支持WebService,允许接受soap消息,此组件不支持jax-rpc规范
    ……
  2. Server Engine(SE) 即服务引擎,简单来说就是把从BC组件收到的消息进行二次处理,比如路由消息,树结构转换, eg:
    servicemix-bean            允许自定义bean,可以自行对消息进行自定义处理
    servicemix-camel           允许对消息路由处理
    servicemix-jsr181           允许自定义通过代码发布WebService接受soap并处理消息
    servicemix-quartz          消息定时处理
    servicemix-saxon           消息格式转换,支持xslt
    servicemix-script            允许在嵌入动态语言对消息进行处理
    ……
  3. Normalized Message Route(NMR) 即标准消息路由,在JBI规范中,BC收到消息后,不能直接传递给下一个BC或者SE进行消息处理,这些传输必须通过NMR转发,NMR转发的消息已经是标准的JBI消息,Servicemix也支持对soap消息进行NMR传递
  4. Delivery channel 即传输通道,上述NMR消息传输的通道
  5. Service Unit (SU) 即服务单元,用户编写的服务的最小单位,每个服务单元都有自己的逻辑进行处理.例如,消息转换,消息路由,通过一个或多个SU的组合完成一次接口调用
  6. Service Assemblys(SA) 即服务集合,简单来说就是把SU大包成SA文件,然后部署到Servicemix中去

先写到这,以后继续补充,ESB设计到太多的J2EE知识,几乎涵盖了J2EE所有特征.

Servicemix EIPs

Aggregator   

         收集并存储单个消息,直到这些有相互关联的多个消息组成一个完整的数据.

           使用时,需要注意下面

          1、Correlation 哪些接受到的数据是关联的

          2、Completeness Condition 什么时候开始处理收到的数据

          3、Aggregation Algorithm 如何把收到的数据集合起来发往另一个消息

          简单示例

Serivcemix笔记

1、在处理JBI消息转换时,时刻留意jbi:message xmlns:jbi="http://java.sun.com/xml/ns/jbi/wsdl-11-wrapper的变化,Servicemix根据此命名空间来进行消息的包装

非常棒的Servicemix文章,有实例分析

直接地址:http://architects.dzone.com/print/3428

Apache Servicemix 简单示例

一个简单的场景,做下笔记:

典型的In-Out接口: cxf-bc(consumer) –> eip “Static Routing Slip” –> saxon –> cxf-bc(provider)

CXF配置

<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=“http://www.springframework.org/schema/beans”
xmlns:cxfbc=“http://servicemix.apache.org/cxfbc/1.0”
xmlns:xsi=“http://http://www.w3.org/2001/XMLSchema-instance”
xmlns:novaesb=“http://www.hongcheng.com/novaesb/selectnumber”
xmlns:clarity=“http://webservices/clarity/api/numbermanagement”
xsi:schemaLocation=“http://servicemix.apache.org/cxfbc/1.0 http://servicemix.apache.org/schema/servicemix-cxf-bc-3.2.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd”>   

 

<bean id=“propertyConfigurer”
        class=“org.springframework.beans.factory.config.PropertyPlaceholderConfigurer”>
    <property name=“location”>
        <value>classpath:slt-npe-config.properties</value>
    </property>
</bean>

<cxfbc:consumer wsdl=“classpath:SelectNumber.wsdl”
    service=“novaesb:SelectNumberServer”
    endpoint=“SelectNumberPort”
    locationURI=“${novaesb.selectnumber.url}”
    targetService=“novaesb:routingSlip”
    targetEndpoint=“endpoint”
    useJBIWrapper=“false”/>

<cxfbc:provider wsdl=“classpath:NumberManagementAPIService.wsdl”
    service=“clarity:NumberManagementAPIService”
    endpoint=“NumberManagementAPIPort”
    useJBIWrapper=“false”/>

</beans>

EIP配置

<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns:eip=“http://servicemix.apache.org/eip/1.0”
xmlns=“http://www.springframework.org/schema/beans”
xmlns:xsi=“http://http://www.w3.org/2001/XMLSchema-instance”
xmlns:novaesb=“http://www.hongcheng.com/novaesb/selectnumber”
xmlns:clarity=“http://webservices/clarity/api/numbermanagement”
xsi:schemaLocation=“http://servicemix.apache.org/eip/1.0 http://servicemix.apache.org/schema/servicemix-eip-3.2.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd”>

<eip:static-routing-slip service=“novaesb:routingSlip” endpoint=“endpoint”>
    <eip:targets>
        <eip:exchange-target service=“novaesb:xslt” endpoint=“endpoint”/>
        <eip:exchange-target service=“clarity:NumberManagementAPIService” endpoint=“NumberManagementAPIPort” operation=“clarity:getNumbersViaAreaHierarchy”/>
    </eip:targets>
</eip:static-routing-slip>

</beans>

XSLT

<?xml version=”1.0″ encoding=”UTF-8″?>
<xsl:stylesheet version=‘1.0’
xmlns:xsl=‘http://www.w3.org/1999/XSL/Transform’
xmlns:novaesb=“http://www.hongcheng.com/novaesb/selectnumber”
xmlns:clarity=“http://webservices/clarity/api/numbermanagement”> 

 

<xsl:namespace-alias stylesheet-prefix=“novaesb” result-prefix=“clarity”/>

<xsl:output method=“xml” indent=“yes” encoding=“UTF-8”/>

<xsl:template match=“//novaesb:getNumbersViaAreaHierarchy”>
    <clarity:getNumbersViaAreaHierarchy>
        <ServiceType><xsl:value-of select=“novaesb:ProductName”/></ServiceType>
        <NumberType><xsl:value-of select=“novaesb:CustomerLevel”/></NumberType>
        <Area><xsl:value-of select=“novaesb:Area”/></Area>
        <CityCode><xsl:value-of select=“novaesb:CityCode”/></CityCode>
        <NumberStatus><xsl:value-of select=“novaesb:NumberStatus”/></NumberStatus>
        <HowMany><xsl:value-of select=“novaesb:HowMany”/></HowMany>
        <NumberPattern><xsl:value-of select=“novaesb:NumberPattern”/></NumberPattern>
        <ConsecutiveFlag><xsl:value-of select=“novaesb:ConsecutiveFlag”/></ConsecutiveFlag>
    </clarity:getNumbersViaAreaHierarchy>
</xsl:template>

</xsl:stylesheet>

可以看到,这里我去掉了JBI的包装,而采用了SOAP的包装,这里是无所谓的.个人建议采用SOAP包装.