Jboss Fuse 简明教程

JBoss Fuse - Camel Concepts

在本章中,我们将理解不同的 Camel 概念。让我们从举一个基本示例开始,首先了解核心概念。

CamelContext

每个 camel 应用程序至少具有一个 CamelContext。这是我们添加 camel 路由的位置。它类似于 Spring 的 ApplicationContext

Camel context 可以被认为是将所有内容组合在一起的容器。一个 camel context 可以容纳多个路由。

Routes

CamelContext 可能包含一条或多条路由。路由是集成逻辑,定义了数据如何在 camel context 从一个端点流到另一个端点。

Endpoint

端点是通道的末端,系统可以通过它发送或接收消息。这就是我们在通信语言中所说的目的地或来源。

Components

组件是 Camel 中的扩展点。组件可以作为技术、数据格式、转换器等的接口。它们还可以充当端点的工厂。

components

EIP

EIP 代表企业集成模式。这些是针对重复出现的问题而确定的众所周知的解决方案。Camel 支持大多数企业集成模式。

Content Based Router

CBR 模式允许我们根据输入文件的内容路由数据。

content based router

当我们必须根据输入正文的内容路由值时,将使用此模式。

以下示例将从 D:/data/input 目录读取数据。读取后,它将在 data 标记内部查找值标记。如果值标记包含 value1 ,它将被发送到 D:/value1 ,如果它包含 value2 ,它将被发送到 D:/value2 ,如果两者都没有,那么它将被发送到其他位置。

<CamelContext xmlns = "http://camel.apache.org/schema/spring">
   <route>
      <from uri = "file:///D:/data/input"/>
      <choice>
         <when>
            <xpath>/data/value = 'value1'</xpath>
            <to uri = "file:///D:/value1"/>
         </when>
         <when>
            <xpath>/data/value = 'value2'</xpath>
            <to uri = "file:///D:/value2"/>
         </when>

         <otherwise>
            <to uri = "file:///D:/others "/>
         </otherwise>

      </choice>
   </route>
</camelContext>

Input

D:/data/input/message1.xml

<data>
   <value>value1</value>
</data>

D:/data/input/message2.xml

<data>
   <value>value2</value>
</data>

Output

D:/value1/

<data>
   <value>value1</value>
</data>

D:/value2/

<data>
   <value>value2</value>
</data>

Splitter

拆分模式用于将输入数据拆分成更小的块。

splitter

此模式通常用于大的数据输入,需要将其拆分成块,以便于处理。它根据输入令牌字符串将输入分解为更小的片段。

<CamelContext xmlns = "http://camel.apache.org/schema/spring">
   <route>
      <from uri = "file:///D:/inbox"/>
      <split streaming = "true">
         <tokenize token = "order" xml = "true"/>
         <to uri = "activemq:queue:order"/>
      </split>
   </route>
</CamelContext>

Input

D:/inbox/message.xml

<order>
   <data>
      <value>value1</value>
   </data>
</order>

<order>
   <data>
      <value>value2</value>
   </data>
</order>

<order>
   <data>
      <value>value3</value>
   </data>
</order>

Output

如果您检查 AMQ,您会发现发布了 3 条消息。

<order>
   <data>
      <value>value4</value>
   </data>
</order>

Recipient List

当需要从消息正文中检索收件人列表时,将使用收件人列表模式。

recipient list

在以下示例中,将向作为逗号分隔字符串列表列在 customer 标记中的所有收件人发送消息。

<CamelContext xmlns = "http://camel.apache.org/schema/spring">
   <route>
      <from uri = "jms:xmlOrders" />
      <recipientList>
         <xpath>/order/customer</xpath>
      </recipientList>
   </route>
</camelContext>

Other EIPs

Camel 几乎支持所有已识别的 EIP。一些常用的 EIP 如下所述。

  1. Log − 记录消息全部或部分内容

  2. Message Filter − 过滤消息内容

  3. Re-Sequencer − 获取序列中的所有令牌

  4. Wiretap − 检查正在传输的消息

EIP 及其用法完整列表可在 Camel 官方文档 http://camel.apache.org/eip.html 中找到

Exception Handling in Camel

Using Error Handler − 这是在 Camel 中处理异常的最简单方法。

要使用此方法,我们必须配置 Error handler 类 bean 并将其作为引用提供给 CamelContext errorHandlerRef 属性。

<bean id = "loggingErrorHandler" class = "org.apache.camel.builder.LoggingErrorHandler">
   <property name = "logName" value = "mylogger.name"/>
   <property name = "level" value = "DEBUG"/>
</bean>

<camelContext errorHandlerRef = ” loggingErrorHandler” >
   …
</camelContext>

Using Try Catch Finally

Camel 还支持 Java 风格 Try Catch Finally block 进行错误处理。

就像 Java 一样,它有以下三个块:

  1. doTry 块包含可能生成异常的代码。

  2. doCatch 块包含在异常情况下需要执行的代码。

  3. doFinally 块具有必须在不考虑异常的情况下执行的代码。无论是否引发异常,此块始终都会执行。

Note − Mock 是测试组件,不建议作它用。这是 Camel 中用于测试的组件,如同 Test 驱动的开发中的 jMock 组件一样。

<route>
   <from uri = "direct:start"/>
   <doTry>
      <process ref = "someProcesorThatmayFail"/>
      <to uri = "mock:result"/>

      <doCatch>
         <exception>java.io.IOException</exception>
         <exception>java.lang.IllegalStateException</exception>
         <to uri = "mock:catch"/>
      </doCatch>

      <doFinally>
         <to uri = "mock:finally"/>
      </doFinally>

   </doTry>
</route>

在上面的示例中,我们可以给出一个需要由 catch 块处理的异常列表。

Deploying Bundle in Fuse

使用 Fuse.bat/start.bat 启动 Fuse。

如果你使用 start.bat 启动 Fuse,请使用 client.bat 连接到 Fuse。你应当获得以下屏幕截图中所示的 UI。

deploying bundle in fuse

这是用于访问 Karaf 和 Fuse 命令的 CLI。

install –s mvn:group.id /artifact.id/version
e.g. install –s mvn:com.tutorialpoint.app/camel-firt-app/1.0-SNAPSHOT