




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ServiceMix企业服务总线(ESB)(一)ESB消息传输的最低要求作为消息传输系统,一个ESB的最少需求经常被简写为TRANS,定义了作为软件实体的ESB提供的功能: -Transforms 转换消息格式,针对已注册的服务提供者的需求将消息从一种格式转换到另一种格式。 -Routes 路由消息,将消息传输到已注册的服务,并保证传输的服务质量、服务层的特性。 -Augments扩展信息,在传输的内容中添加额外信息,比如关于消息请求者的元数据。在消息中添加新的通信协议内容以满足服务提供者的需求。 -Notifies通知消息监听者的特定消息请求 -Secures 安全传输,对于传输的消息增加消息认证、授权、不可否认性、机密性等机制。JBI(Java Business Integration, Java业务集成)介绍JBI规范及API描述了构建基于插件、基于服务设计的企业级ESB系统的平台。JBI以TRANS需求为基础,基于组件交互和规范化消息(normalized messages)而设计。JBI是一种规范及API,提供了规范化消息服务、组件框架和管理模型,用以部署路由引擎、规则引擎、以及信息转换等集成服务。基于JBI规范的设计使用特定的基于标准的可插拔架构,此架构内包含一基于 JVM 运行时(runtime)的称为规范化消息路由器(normalized message router,NMR)的组件。JBI架构的高层组件交互见图1图1 JBI系统高层架构图JBI的消息模型基于WSDL,可以很容易地映射到Web服务, HTTP, 电子邮件及JMS中。JBI可以集成旧系统、字节传输、面向文档的传输 (document-oriented transports)以及RPC(Remote Procedure Call, 远程过程调用)等。图1中的绑定组件(binding components)同面向传输协议的关联方或关联组件通信。图1中的JBI 服务引擎组件(service engine components)提供基于内容的路由、服务整合、规则引擎、信息转换、可定制的信息增强等服务。规范化消息JBI系统使用“规范化”消息。消息内包含应用信息荷载、可选的附件、以及用于请求应答双方交互的元数据。消息的规范化过程是将环境相关的信息映射为中立于环境的、抽象的、标准的格式,以便在JBI中传输。所有由规范化消息路由NMR处理的消息都需规范化处理。规范化消息由如下的三个主要部分构成:1. 消息内容,亦即荷载,是符合WSDL消息格式的XML文档,不包含针对传输协议或者信息格式的编码。 2. 消息属性,或元数据,是消息携带的额外信息,可以包含安全信息、事务上下文信息、组件特定信息等。消息属性是消息上下文的第一部分。 3. 消息附件,是由消息荷载引用的,包含在一个可以解析处理附件内容的信息处理器内。附件可以是非XML信息。附件是消息上下文的第二部分。规范化消息路由JBI系统内消息交换依赖于规范化消息路由NMR在服务者和消费者之间路由消息交换对象(message exchange objects)。针对应用的不同需求以及消息本身特性,NMR提供不同服务质量的消息传输服务。NMR并不寄宿于任何一个具体的对象中,它被抽象成一套应用程序接口、服务提供者接口、组件接口等。NMR API包括:-JBI Message API JBI消息接口 -JBI Service API JBI服务接口 -JBI Message Exchange Factory API JBI消息交换对象工厂接口 -Service Description SPI 服务描述接口 -Message Exchange Patterns API 消息交换模式接口 -Endpoint Reference API 端点引用接口传输通道JBI传输通道是双向的通信管道,通过NMR传输消息以连接绑定组件和服务引擎。接口javax.jbi.messaging.DeliveryChannel确定服务消费者、服务提供者和NMR三者之间的接口合约关系。服务使用者通过其传输通道初始化服务调用请求;服务提供者通过其传输通道接受消费者的调用请求。既是使用者又是提供者的组件使用相同的一条传输通道。因此,接口DeliveryChannel的实现必须支持通道实例在多线程下的并发使用。JBI组件JBI组件框架提供了可插入的接口,绑定组件和服务引擎可以通过此接口与JBI系统交互。组件框架提供了所有访问JBI服务的接口。JBI支持二种类型组件,服务引擎和绑定组件。组件可以通过以下二种方式与系统交互:1. SPIs: 由绑定组件或服务引擎实现的接口。 2. APIs: 系统提供的,绑定组件或服务引擎可以访问的接口服务引擎服务引擎是JBI系统内的业务逻辑实现组件,可以作为服务提供者或使用者。服务引擎对服务使用和需求提供整合点。也可以提供诸如信息转换、复杂的路由、以及协调信息等功能。绑定组件绑定组件被用来在特定的协议和传输方式中发送和接收消息。通过绑定组件,JBI系统与特定的传输协议解耦。这是通过绑定组件对消息进行相应的协议特定和协议无关的编组(marshalling)和解组(unmarshalling)而实现的,这样JBI环境内仅处理规范化的消息。规范化消息交换(Normalized message exchange)JBI首要用途是在组件间路由规范化消息。消息传输时处于规范化形式。绑定组件必须将特定于协议(传输层)的消息转换为规范化形式。 绑定组件和服务引擎通过传输通道与NMR通信,传输通道提供消息的双向传输机制。一个JBI系统外服务使用者通过特定协议/传输层发送服务请求到绑定组件。绑定组件转换请求消息为规范化消息,构造一个称为消息交换(message exchange)的消息包, 然后通过传输通道传输到NMR,再由NMR路由到服务提供者。当所使用的服务引擎或绑定组件收到消息后,创建相应的规范化消息,将此规范化消息填充到一个新的MessageExchange实例中,并传输到目标ServiceEndPoint实例处。服务端点获得消息交换对象后,恢复规范化消息为协议/传输特定格式,然后将消息传输到外部服务提供者。服务单元在已安装的引擎或绑定组件中部署的特定于某组件的构件,一般被称为服务单元。服务单元被集成为一个部署文件,称为服务组合。服务组合包含一个部署描述符文件,指定组合中各服务单元的部署方式,如确定将某服务单元部署到那个组件。服务单元包含内容如下:-元数据:使用或者生成的服务的JBI描述符 -生成物:一般是XML信息(可能是二进制,或者目标绑定组件或服务引擎需要的任何对象)ServiceMix 简介ServiceMix是基于JBI的ESB。它是开源的基于JBI语义和API的ESB和SOA工具包,以Apache许可证方式发布。 它是轻量的ESB实现,易于作为嵌入式ESB使用;集成了对Spring技术的支持;可以在客户端或服务器端运行;可以作为独立的ESB提供者,也可以作为另外ESB的服务组件; 可以在JavaSE或JavaEE服务器中使用;ServiceMix同Apache Geronimo以及JBoss服务器完全集成,并且在Apache Geronimo服务器中可以直接部署JBI组件和服务。图2 是JBI和ServiceMix关系图图2 . JBI和ServiceMixServiceMix 中包含完整的JBI容器,支持JBI规范的所有功能要求:-规范化消息服务和路由 -JBI管理Beans (MBeans) -组件管理和安装的Ant任务 -对JBI部署单元的完全支持,支持JBI组件的热部署ServiceMix还包含如下的组件和服务:-Service服务组件o 通过Drools规则引擎的提供基于规则的路由 o 提供客户端API与JBI组件和服务交互 o Web服务通知(Web Services Notification)协议的实现 o 通过PXE(preboot execution environment, 预启动执行环境)提供对于Web服务BPEL(Business Process Execution Language,业务流程执行语言)的BPEL的支持 o 使用Map缓存或者JCache,支持服务调用缓存 o 支持Java连接架构 o 通过Quartz库集成Timer任务 o 脚本语言支持。任何兼容于JSR-223规范的脚本语言可以用来创建组建,执行信息转换,或者作为表达式语言使用。 o 支持XSLT扩展样式语言转换 o 通过JAXP 1.3 和XML Schema或者RelaxNG提供XML Schema验证支持。 o 通过Oracle的XSQL库支持SQL及XML的XSQL-SOAP绑定组件o 通过ActiveSOAP提供基于StAX(XML流处理API)的对SOAP栈的支持 o对基于JAXP的Web服务客户端调用、 服务宿主提供支持,并且支持多种协议方式 o 使用反射支持POJO对象的部署。 o 支持Java SOAP附件API和Apache Axis o 通过XFire SOAP栈集成POJO对象支持 o 集成Apache WSIF (Web Service Invocation Framework,Web服务调用框架)-传输绑定o 通过JavaMail支持Email功能 o 基于文件操作的组件提供将消息写进文件、目录轮询、向JBI发送文件 o 通过Jakarta Commons Net库提供FTP支持 o 支持客户端/服务器端HTTP处理 o 通过 XMPP (Extensible Messaging and Presence protocol,可扩展的消息提供协议)提供与Jabber网络的连接 o 使用ActiveMQ支持JMS功能 o 使用Rome库支持RSS的访问及处理 o 使用Jakarta Commons Net库支持VFS(virtual filesystem switch,虚拟文件系统转换),提供对于文件系统、jar/zip/bzip2临时文件、万维网分布验证及版本机制、Samba文件系统、HTTP、HTTPS、FTP、SFTP等的访问。大部分的ServiceMix系统初始化过程、活动过程以及消息交换过程,涉及到基于JBI的组件间的通信或交互。 以下部分通过简单的消息交换场景说明这些过程. (ServiceMix 2.0)初始化JBI容器使用JBI容器之前,必须调用其init()方法执行初始化过程。此方法会实例化核心系统服务,为JMX管理BEAN服务器以及事务管理器等资源赋值。代码1是容器启动代码.代码1. JBI容器初始化protected JBIContainer jbiContainer = new JBIContainer();jbiContainer.init(); JBIContainer类的init方法会依次进行如下操作:-初始化org.servicemix.jbi.management.ManagementContext对象,并在JMX MBean服务器中注册。此对象是JBI管理工具如JMX管理器的调用的首要访问点。 -初始化org.servicemix.jbi.container.EnvironmentContext实例并在JMX MBean服务器中注册。此对象创建资源目录结构,各种资源包括安装文件、部署文件、组件、共享库、服务组合的文件等 -初始化org.servicemix.jbi.framework.Registry实例,此对象维护服务端点和组件等信息。 -初始化org.servicemix.jbi.nmr.Broker实例,此对象管理消息队列,并在org.servicemix.jbi.nmr.flow.Flow对象帮助下分发消息。消息流程对象管理消息代理对象的消息分发策略。 -初始化实现org.servicemix.jbi.framework.FrameworkInstallationService的实例,此对象管理文件包的安装和卸载。 -初始化org.servicemix.jbi.framework.DeploymentService实例,此对象部署服务单元及其相关服务单元。启动JBI容器如下面代码2所示,简单的调用JBIContainer对象的start()方法即可触发JBI容器的启动过程。此过程会启动所有嵌入的组件和服务,比如服务注册区、消息代理、管理上下文、环境上下文、安装服务、部署服务等。多数组件和服务的启动过程仅仅设置一个标志位,以表明组件或服务处于运行状态,而且与组件关联的定时计划任务开始执行。代码2.启动JBI容器jbiContainer.start(); 创建支持组件ServiceMix框架中作为消息生产者和提供者的对象常被称为支持组件。这些对象实现了ponent.Component接口,使得JBI容器和其它关联对象能够以标准方式操作它们。在ServiceMix系统中,此类对象一般继承于ponents.util包内的某些支持(Support)类,比如ComponentSupport或者PojoSupport。 通过继承,支持组件获得了作为JBI组件的缺省行为,比如JMX功能等。支持组件一般通过ponent.ComponentContext对象获得DeliveryChannel对象,以用于实际的消息交换(message exchange)对象的创建和处理。请留意代码3中支持组件的类/接口层次。代码3 支持组件类层次/PojoSupport类封装了简单的基于POJO的组件,提供标准的被ServiceMix管/理的组件的功能public abstract class PojoSupport extends org.servicemix.jbi.management.BaseLifeCycle implements ponent.ComponentLifeCycle/ComponentSupport类扩展了PojoSupport类,提供标准JBI组件功能。public abstract class ComponentSupport extends ponents.util.PojoSupport implements ponent.Component/ SenderComponent类是消息生产者public class SenderComponent extends ponents.util.ComponentSupport implements Sender/ 类ReceiverComponent是消息消费者public class ReceiverComponent extends ponents.util.ComponentSupport implements org.servicemix.MessageExchangeListener, Receiver激活支持组件在使用ServiceMix ESB系统中的组件前,这些组件必须得到“激活”。相应步骤如下:-创建DeliveryChannel类的实例, 此对象参与随后的消息交换DeliveryChannel负责:o 获取路由到此组件的消息 o 发送异步消息 o 发送同步消息-注册org.servicemix.jbi.framework.ComponentRegistry类的组件,注册后获得一个org.servicemix.jbi.framework.ComponentConnector类的实例,Servicemix 系统在内部使用此ComponentConnector对象来交换消息。-在组件注册区内注册上面步骤获得的ComponentConnector对象,将此对象与org.servicemix.jbi.container.EnvironmentContext关联。此对象维护组件运行的JBI执行环境,包括安装路径、部署路径、服务单元目录等信息。-调用组件的生命周期init()方法,然后执行其start()方法。-封装对象的ComponentConnector实例为一个JMX 管理Bean,并在JBI容器的JMX管理Bean服务器(MBeanServer)中注册此Bean。激活组件需要与org.servicemix.jbi.container.JBIContainer 类交互,调用其activateComponent()方法。 此方法使用org.servicemix.jbi.container.ActivationSpec类的实例,以此构建有效的JBI组件。ActivationSpec对象是最终可以被激活的三种Java类型中的一种的实例。 对应类型如下:1.ponent.Cponent.ComponentLifeC.servicemix.MessageExchangeListener:此对象实例被封装在ponents.util.PojoLifecycleAdaptor或ponents.util.PojoLifecycleAdaptor 或ponents.util.ComponentAdaptor 类型实例中。比如ponents.util.ComponentAdaptorMEListener。代码4 说明了如何激活消息发送和接收组件。代码4 激活发送和接收组件/激活发送组件String senderComponentID = sender;org.servicemix.jbi.container.ActivationSpec senderActivationSpec = new org.servicemix.jbi.container.ActivationSpec(senderComponentID, sender);jbiContainer.activateComponent(senderActivationSpec);/激活接收组件String receiverComponentID = receiver;org.servicemix.jbi.container.ActivationSpec receverActivationSpec = new org.servicemix.jbi.container.ActivationSpec(receiverComponentID, receiver)jbiContainer.activateComponent(receverActivationSpec);使用支持组件发送以及接收消息在ServiceMix中发送消息,需要通过发送者支持组件传输此消息,需要消息接收支持组件监听并接收此信息。典型的发送组件1.从ComponentContext组件获取javax.jbi.messaging.DeliveryChannel实例 2.从DeliveryChannel实例获取javax.jbi.messaging.MessageExchangeFactory类实例 3.使用MessageExchangeFactory实例创建包含消息内容的javax.jbi.messaging.MessageExchange实例 4.通过DeliveryChannel实例将MessageExchange实例发送到目的地。代码5中通过发送组件发送基于字符串的XML消息代码5. 发送消息public void sendMessage(String xml) try ComponentContext context = getContext(); InOnly exchange = context.getDeliveryChannel(). createExchangeFactory().createInOnlyExchange(); NormalizedMessage message = exchange.createMessage(); message.setContent(new StringSource(xml); if (resolver != null) ServiceEndpoint destination = resolver.resolveEndpoint(getContext(), exchange, NullEndpointFilter.getInstance(); exchange.setEndpoint(destination); exchange.setInMessage(message); / 现在,发送exchange消息 context.getDeliveryChannel().send(exchange); catch (Exception e) e.printStackTrace(); 对特定消息感兴趣的组件可以通过JBI框架提供的多种途径来订阅消息交换对象。一种简单机制是,接收组件可以实现MessageExchangeListener 接口,发送组件设定此接受者为org.servicemix.jbi.resolver.EndpointResolver端点解析组件。这样设定之后,ServiceMix会完成从发送者到接受者的消息传输过程。代码6说明了此过程。代码6 基于端点解析的简单接收过程public class ReceiverComponent extends ComponentSupport implements MessageExchangeListener, Receiver. / MessageExchangeListener接口的方法 public void onMessageExchange(MessageExchange exchange) throws MessagingException NormalizedMessage inMessage = exchange.getMessage(in); if (inMessage = null) throw new MessagingException(Null in message delivered!); System.out.println(inMessage); /创建接收与发送组件,并将接收组件设置为发送组件中的EndpointResolver对象ReceiverComponent receiver = new ReceiverComponent();SenderComponent sender = new SenderComponent();sender.setResolver(new ServiceNameEndpointResolver(ReceiverComponent.QNAME);图3 是ServiceMix中发送接收简单消息交换的序列图图3. 发送接受简单消息在Windows中安装启动ServiceMix下
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论