JBoss Fuse - Camel 概念

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

CamelContext

每个 Camel 应用程序至少有一个 CamelContext。这是我们添加 Camel 路由的地方。它类似于 Spring 的 ApplicationContext

Camel 上下文可以被认为是一个将所有事物放在一起的容器。一个 Camel 上下文可以包含多个路由。

路由

CamelContext 可能包含一个或多个路由。路由是集成逻辑,它定义了数据在 Camel 上下文中如何从一个端点流向另一个端点。

端点

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

组件

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

Components

EIP

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

基于内容的路由器

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

基于内容的路由器

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

以下示例将从 D:/data/input 目录读取数据。读取后,它将检查数据标记内的值标记。如果值标记包含 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>

输入

D:/data/input/message1.xml

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

D:/data/input/message2.xml

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

输出

D:/value1/

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

D:/value2/

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

分割器

分割器模式用于将输入数据分割成较小的块。

分割器

此模式大多数情况下用于需要分割成块的大量数据输入,以便可以处理。它根据输入标记字符串将输入分解为较小的片段。

<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>

输入

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>

输出

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

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

收件人列表

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

收件人列表

在以下示例中,将向客户标签中列出的所有收件人发送一条消息,这些收件人以逗号分隔的字符串列表形式列出。

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

其他 EIP

Camel 支持几乎所有已识别的 EIP。下面列出了一些常用的 EIP。

  • Log − 记录完整消息或部分消息

  • Message Filter − 过滤消息内容

  • Re-Sequencer − 按顺序获取所有令牌

  • Wiretap −检查传输消息

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

Camel 中的异常处理

使用错误处理程序 − 这是在 Camel 中处理异常的最简单方法。

要使用它,我们必须配置错误处理程序类 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>

使用 Try Catch Finally

Camel 还支持 Java 风格的 Try Catch Finally 块 用于错误处理。

与 Java 一样,它具有以下三个块 −

  • doTry 块包含可能产生异常的代码。

  • doCatch 块包含在发生异常时需要执行的代码。

  • doFinally 块包含无论是否发生异常都必须执行的代码。无论是否引发异常,它都会始终执行。

注意 − Mock 是测试组件,不建议用于其他目的。它是 Camel 中用于测试的组件,就像测试驱动开发中的 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 块处理的异常列表。

在 Fuse 中部署 Bundle

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

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

在 Fuse 中部署 Bundle

这是用于访问 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