JBoss ESB是什么

来源:百度文库 编辑:神马文学网 时间:2024/04/28 04:24:43
JBoss ESB是一个开源的ESB,它基于RosettaNet ESB,支持服务的创建、部署和整合。
从架构上而言,可以将Jboss ESB中的一切都看作是服务。这些服务并非Web Services,而是ESB服务,这些ESB服务可以通过多种传输暴露出来。所有的ESB服务都有一个方法(doWork),可以通过下面的接口(由所有的服务共享)描述:
[blockquote]Message output = service.doWork(Message input) [/blockquote]在JBossESB中,ESB消息和SOAP消息类似,都由几个部分组成,包括标头(header),消息体(body),错误(fault),附件(attachments),等等。每个部分包括一个可序列化的java对象集合(map),通过集合中定义的name进行访问。这就意味着JBossESB消息并不是强类型的,在访问消息时需要注意(类型转换)。
服务定义的形式:
    [li]服务目录/名称(Service Category/Name)——Jboss ESB有一个内部的服务注册机制(部署服务时,服务会自动注册),其内部为访问服务提供优化机制。 [/li][li]输入消息组件 —— 包括名称(names)(在入站消息体中)和类型(type) [/li][li]输出消息组件 —— 包括名称(names)(在出站消息体中)和类型(type) [/li]
传统ESB是使用一系列拦截器(interceptor)构建服务,允许在服务调用管道(pipeline)中注入额外处理。不同的是,JBoss ESB将服务作为一个显式的管道(pipeline)来构建,管道包含一系列的动作(action),如图2所示,每个action实现了(潜在部分的)服务业务功能或者基础功能,比如在消息存储中存储服务消息。

图2 JBoss ESB服务
与基于拦截器的传统ESB不同的是,JBoss ESB可以很好地隔离“业务”(服务实现)和相关基础设施(拦截器)。JBoss ESB在可执行的管道中将二者连接起来。然而这并非毫无价值,在一个服务管道中包含所有action都可以简化服务处理的理解。
JBoss ESB中的服务action是一个java类,它必须实现接口类DE>org.jboss.soa.esb.actions.ActionLifecycleDE>。服务的实现往往将服务功能分解成一系列的action,然后分别实现每个action。这类服务实现组织为JBoss ESB开发者提供了两个级别的复用——服务本身和可以在多个服务中复用的action。JBoss同样也提供了一个可复用action库。该库中包括如下类型的action[sup]1[/sup]:
    [li]转换器(Transformers & Converters) [/li][li]支持JBPM [/li][li]脚本(Scripting) [/li][li]路由(Routing) [/li][li]支持Web Service [/li][li]Misc [/li]
服务请求可通过多种传输传递。服务定义包括一系列传输/端点的引用。服务在端点(每个端点都有一个唯一指定的服务)上监听消息。服务定义中也可以通过指定(在传输上)处理服务请求的线程数来配置服务的吞吐量。
服务action调用的设置和顺序以及服务监听的端点都是在jboss-esb.xml文件中配置。可以给指定的服务配置一系列action(它们由JBoss或者特定的公司或者服务所提供)。这种支持action的外部XML配置,极大地提高了actions的复用。
JBoss ESB中的服务调用
正如上文中提到, JBoss ESB中的一切都服务,异步[sup]2[/sup]调用是默认的调用模式。JBoss ESB同样也支持同步调用,同步调用可以使用相关性实现。ESB服务的同步和异步调用可以通过下面两种方式进行控制:
    [li]服务实现通过使用消息交换模式(MEP)参数定义服务行为(service behavior)。Request-Response是默认的MEP,也就是说服务必须返回一个响应(response)。如果将MEP设置成为one-way,那么服务无需返回响应信息。 [/li][li]服务消费者可以自己定义它是否需要回复。如果需要,request-response MEP服务将返回一个响应信息[sup]3[/sup]。 [/li]
为了简化服务调用,Jboss ESB提供了org.jboss.soa.esb.client.ServiceInvoker类,该类为服务调用提供了一个非常简单的接口,调用时只需要提供一个目录/服务名称作为参数。
JBoss ESB的本地服务调用
除了远程传输外,JBoss还提供了高效的本地(在同一个JVM中)调用机制,它是通过一个内存队列来实现的。当在服务调用中使用org.jboss.soa.esb.client.ServiceInvoker时,如果该服务采用本地调用且采用本地部署,那么内存传输总会被选择用来优化性能。
支持Web Services
如今,当人们谈论ESB时,经常会强调Web Services的处理。技术上而言,JBoss ESB中包含很多基于Web Services的组件,这些组件可以暴露和调用Web Services端点(比如,总线上SOAP的开启和关闭):
SOAPProcessor通过JBossESB托管的监听器支持调用JBossWS托管的WebService端点。这意味着可以通过ESB为其它的ESB服务暴露Web service端点。它是基于一个轻量级的服务包装器(ServiceWrapper)Web service(比如,JSR 181规范[sup]4[/sup]的实现)而实现的,通过它可以调用目标服务(target Service)。这也意味着这些服务可以通过ESB所支持的传输通道(http, ftp,jms等)进行调用。在Web Service端点(使用JAXWS注解的java类)上配置的SOAP处理器(processor),实际上由WebService端点处理SOAP请求。
SOAPClient使用WISE[sup]5[/sup]客户端服务生成JAXWS客户端代码,并调用目标服务。通常是使用Web Service的WSDL的URL动态生成JAXWS客户端,以调用web service。
在开发的过程中,我们发现采用这种方式使用web service是很笨重的,所以需要采用如下策略:
    [li]要是消费web service,我们直接通过可用的WSDL生成web service客户端(可以采用Axis 1,Axis 2 或者JBoss WS)。 [/li][li]要是暴露ESB服务,我们可以为SOAP采用JBoss WS ,为REST采用RestEasy来暴露DE>org.jboss.soa.esb.client.ServiceInvokerDE>,并调用所需的服务。这在架构上和使用SOAPProcessor是一样的,但更通用一些,这允许服务功能可以暴露成SOAP、REST或者其它所需接口。 [/li]
JBoss ESB工具
通过XML文件可以配置服务监听器和服务执行管道。该XML配置文件由3个文件组成,这些是配置ESB服务[sup]6[/sup]不可缺少的文件:
    [li]jbm-queue-service.xml中定义了服务[sup]7[/sup]所用的每个传输(通常是队列)相关的MBean。 [/li][li]deployment.xml定义了服务依赖的所有传输。部署ESB服务时会验证该文件中的依赖关系是否正确。 [/li][li]jboss-esb.xml中定义了监听器和服务管道。 [/li]
虽然jbm-queue-service.xml和deployment.xml文件可以直接通过XML进行编辑,但JBoss提供了工具简化ESB项目[sup]8[/sup]的创建、部署和维护。图3 显示了jboss-esb.xml的编辑器。

图3 JBoss ESB工具
该工具以图形化的方式添加和配置监听器、服务和动作(包括动作的参数)。
使用Smooks实现数据转换
最重要的服务动作是数据转换。JBoss ESB使用Smooks[sup]9[/sup]实现数据转换。Smooks的基本原理是使用多种类型的数据源,并从数据源中生成事件流。然后对事件流采用访问者模式(Visitor pattern)生成不同类型的数据。[sup]10[/sup]它支持多种不同的数据源和数据类型,这意味着支持多种转换类型,包括(但不仅限这些):
    [li]XML to XML [/li][li]XML to Java [/li][li]Java to XML [/li][li]Java to Java [/li][li]EDI to XML [/li][li]EDI to Java [/li][li]Java to EDI [/li][li]CSV to XML [/li][li]CSV to ... [/li]
为了简化Smooks的使用,JBoss ESB提供了特定的action[sup]11[/sup],可以通过配置直接调用Smooks——并将转换作为服务管道的一部分。
为什么是Smooks?
技术上而言,可以直接通过java代码实现数据转换,那么为什么要使用Smooks呢?(记住:Smooks是基于XML配置文件的,编写XML文件往往比直接通过Java代码实现还要慢[sup]12[/sup]……) 数据转换中使用Smooks的好处:
    [li]与Java实现不同的是,Smooks不需要处理任何if-then逻辑。可以为数据源中的所有元素定义映射,如果数据源中不存在某个元素,那么将不会生成映射。 [/li][li]Smooks的文件结构对应组件的映射。 [/li][li]Smooks可以使用外部的转换定义,因此提高了整体维护服务的效率。 [/li][li]JBoss/Smooks为Smooks提供了一个图形化的编辑器,通过该编辑器可以设计数据转换。 [/li]
Smooks工具
JBoss ESB工具为可视化定义Smooks转换提供了图形化编辑器。

图 4 Smooks图形编辑器
数据转换创建完后,可以通过Smooks的执行报告(图 5)以视图的形式展现该过程中的所有执行步骤。该视图极大程度上简化了Smooks转换的debug过程。

图 5 Smooks执行报告
常见的Smooks转换设计错误
设计Smooks转换时,最重要的是要记住转换不是上下文敏感的。也就是说,比如,有如下一个XML文档:
[pre]

12345


12345

[/pre]当使用“c”作为选择器时,它会被调用两次。第一次是“b”元素里面的“c”,第二次是“d”元素中的“c”,即使是使用选择器\"b\"也会调用两次。
为了避免出现这些问题,需要使用源文档中具有唯一名称的选择器。