Basic 事例演示下面的操作:

  • use of declarative programming
  • 如何使用 ActiveMQ 消息经纪人(message broker)
  • 如何使用 Quartz 定时器
  • 如何使用 Jencks JCA 容器
  • 如何使用 Geronimo事务管理 ,通过使用 Jencks factory bean
  • 如何跟踪

Basic 事例的源代码存放在ServiceMix 安装目录下的examples/basic/src/main/resources 目录里面的servicemix.xml文件

 

servicemix.xml文件里面有多个组件. 一个组件释放一个触发发送消息给目标. 这些消息被另外一个组件消费,然后发送给另外的一个输出目标.一个跟踪组件在消息到达时显示消息.

 

运行Basic 事例

 

 

然后输入:

 

 

该事例启动一个 ActiveMQ JMS 经纪人(Broker), 来确保能够关闭任何已运行的 ServiceMix 服务器.

 

停止 Basic 事例

要中止Basic 事例,在服务器运行的命令shell 中输入 "CTRL-C".

 

 

示例:

 

 

 - -

 

- -

 

 

它如何工作

 

下面的图演示了通过Basic各组件的消息的流动.

 

Basic事例消息流示意图(Basic Example Message Flow Diagram)

 

 

 

消息流是这样通过各个组件的:

  1. 定时器(timer) 组件经过常态消息路由(Normalized Message Router (NMR))发送一个消息给inputSender .
  2. inputSender 把消息(marshals it)转换成JMS消息 ,然后使用 jmsTemplate 种子(bean)公布消息.
  3. jmsTemplate 使用 jmsFactory种子(bean)取得端口连接,端口与名为"demo.org.servicemix.source"的JMS 主题向关联 ,消息就以 "demo.org.servicemix.source" 为主题被发布.
  4. jencks (the JCA resource adapter) 在61616端口监听消息.
  5. inputReceiver 通过jencks来订购"demo.org.servicemix.source" 主题并且接收JMS消息.
  6. inputReceiver 常态化JMS 消息并通过NMR把消息发送给 outputSender.
  7. outputSender 把常态消息编组为JMS 消息并使用 jmsTemplate 以"demo.org.servicemix.result"为主题来发布消息.
  8. jmsTemplate 以"demo.org.servicemix.result"为主题来发布消息, 通过使用 jmsFactory 取得同结果主题( result topic)的连接.
  9. jencks 在61616端口监听消息.
  10. jmsTrace 订购"demo.org.servicemix.result" 主题并通过 jencks接收JMS 消息.
  11. jmsTrace把JMS 消息转换成常态消息并通过NMR 发送给trace.
  12. trace 把常态消息转换成一个字符串并把它作为日志输出到控制台.

每间隔5秒钟就有信息输出到控制台,同时也有来自trace组件的信息. 注意, triggers的属性 "name", "My Example Job", "group", and "ServiceMix"的值在显示的时候带有一个时间戳. 典型的输出如下:

 

细节(Details)

下面的表提供关于servicemix.xml文件中的每个组件和bean的更多的细节.

组件或者Bean ID 描述
jbi jbi JBI容器的id,为下列的组件提供底层服务: timer, inputSender, inputReceiver, outputSender, jmsTrace, and trace. 在初始化过程中, 多个个体被初始化,他们是: transactionManager, broker, jencks, jmsFactory, and jbi. 初始化之后, 在 jbi 容器里的各个组件被激活, 和 timer 组件一起启动.
timer timer 组件体现了Quartz组件类的使用.每间隔5秒钟, 除非程序停止, timer 组件触发一个SimpleTrigger的实例, 这个实例和JobDetail的实例相关联. 这项工作具有一个值为"My Example Job"的 "name" 属性和另外一个值为"ServiceMix."的"group"属性(The job has a property called "name" with a value of "My Example Job" and another property called "group" with a value of "ServiceMix.") 结果消息被转换成常态的消息然后通过NMR路由.
inputSender 这是在 JBI 内部的组件. 它接收常态消息(来自于 trigger), 转换消息为JMS消息, 然后发行该消息给名为"demo.org.servicemix.source"的主题. 它使用jmsTemplate(1) 种子(bean)来处理发行过程.
inputReceiver 该组件使用 jencks(JCA容器)在61616端口监听主题为"demo.org.servicemix.source"的JMS消息. inputReceiver 订阅"demo.org.servicemix.source"主题. 它获取消息,常态化消息,并通过NMR路由给outputSender. 该组件与组件 outputSender组合并支持beans 创建两个主题之间的JMS桥路(and supporting beans creates a JMS bridge between two topics).
outputSender 该组件从NMR处接收一个常态的消息, 使用jmsTemplate把消息编组成一个JMS消息,然后依照名为"demo.org.servicemix.result"的ActiveMQ (JMS)主题发行它.
jmsTrace 该组件使用 jencks 订阅 "demo.org.servicemix.result" 主题并且得到消息. 接着它把消息编组成为一个常态消息并通过NMR路由给trace组件.
trace 组件通过NMR 接收来自于jmsTrace的常态消息. 把常态消息转换成一个字符串并记录到控制台上.
jencks jencks种子(bean) 定义了一个 JCA 容器. JCA 容器允许你配置线程池的储存,配置一个事务管理员,配置一个资源适配器.本例子中, 资源适配器是一个ActiveMQ 适配器, 不过, 也可以配置另外一个JMS监听器(another JMS listener could be configured instead). 适配器监听61616端口上的JMS 消息.
broker broker种子( bean) 使用 activemq.xml 文件来配置消息broker,消息broker为需要JMS消息服务的组件处理 JMS 消息.
transactionManager 这个种子( bean)被配置成为jbi容器的默认事物管理者. jencks通过配置来使用这个磨人的事物管理者.这个事物管理者提供资源适配器(这种情况下,是由jencks JCA 容器提供的ActiveMQ资源适配器)和JBI容器里的组件之间的传输服务.
jmsFactory 该种子( bean) 监听61616端口,并提供一个( pooled ActiveMQ connection).

1. jmsTemplate: JmsTemplate 是一个 Spring 组件,当发送JMS消息时,它隐藏低水平的细节(hides the low level details). 更多信息参考: JmsTemplate jmsTemplate 不是jbi容器内部的组件. 它被 inputSenderoutputSender使用.

应用案例(Use case)

ServiceMix 是一个企业级的服务总线( Enterprise Service Bus (ESB)),它基于Java业务集成( Java Business Integration (JBI)) 标准 JSR 208基于JBI的设计以基于标准的可插入式架构为显著特点,该架构具备一个被称为常态消息路由(NMR)得基于JVM运行时的组件. 本 Basic 事例 演示了应用如何通过 ServiceMix ESB进行通信联系, 还有 NMR 在通信联系中所扮演的角色. 一些类似的技术(例如. SAP, Peoplesoft, spreadsheets, POJOs, Webservices and EJBs) 可以用来实现把外部1的应用或服务插入到ServiceMix里面,并允许它同其他外部的使用ServiceMix的应用或组件进行通信联系 (and allow it to communicate with other external applications or components using ServiceMix itself).

一个假定的商业应用范畴,它扩展Basic 事例, 是一个仓储分发者(中间人)(is that of a department store distributor). 分发者从多个批发商(提供者)那里批发货物,卖给多个零售者(消费者). 分发者为它的每一个部门存储消费者的产品定购提供一个公共接口. 但是,分发者必须通过另外一个定购接口与每一个批发商联系.

使用 ESB, 分发者发展了很多组件来接收仓储定购信息并且动态地路由转换这些定购信息到相应的批发者.这个定购过程流描述如下:

  1. 通过使用分发者的网络接口, 一个仓储消费者提交对一个多产品的定购. 一个HTTP 请求被发送给 OrderReceiver, 它是一个 HTTP关联组件( binding component (BC)). 3
  2. OrderReceiver 发送这个消息给一个 OrderRouter 服务引擎(service engine (SE)) 4 组件. 这个SE 负责解析这个定购并根据消息内容决定哪一个 OrderTransformer来接收消息的哪一部分(譬如, 对某一个产品的定购).
  3. OrderRouter 把这个消息公布给相应的消息主题,消息主题是以消息内容为基础的(publishes the orders to the appropriate message topics based on the message content). 特别指出的是, OrderRouter 公布消息,消息是基于哪一个批发商买那件商品(publishes the messages based on which wholesaler sells the item).
  4. OrderTransformer是一个服务引擎组件, 它修改消息并且把消息格式化成对批发商接口可读的格式,这个开发商接口将完成此次定购.
  5. 每一个OrderTransformer 发送修改好了的消息到 OrderProcessor.
  6. OrderProcessor 是一个关联组件,它具备2个功能:
    a. 它把定购消息提交给相应的批发商,通过批发商的网络服务或者专有的接口.
    b. 再就是它以一个主题的形式来公布定购消息.
  7. 主题形式的信息接下来被BusinessMonitor 组件通过 jmsTrace 组件拾取.
  8. BusinessMonitor 组件为质量保证和业务分析(譬如数据挖掘)对定购进行监控.

下图对此进行了诠释:

 

 

  1. 外部(External) 是指应用在ESB的外面.
  2. 资源适配器(Resource Adapter): 资源适配器提供特定的外部的应用与ESB的连接机制. 在 Basic 事例里,jencks 容器提供了一个 JMS资源适配器( resource adapater).
  3. 关联组件(Binding Component (BC)): 关联组件提供ESB外部的应用的连通性(connectivity).
  4. 服务引擎(Service Engine (SE)): 服务引擎给企业服务总线(enterprise service bus)内的其他组件提供业务逻辑和传输服务.
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐