JBoss Fuse - Camel 概念
在本章中,我们将了解不同的 Camel 概念。让我们先从一个基本示例开始,以了解核心概念。
CamelContext
每个 Camel 应用程序至少有一个 CamelContext。这是我们添加 Camel 路由的地方。它类似于 Spring 的 ApplicationContext。
Camel 上下文可以被认为是一个将所有事物放在一起的容器。一个 Camel 上下文可以包含多个路由。
路由
CamelContext 可能包含一个或多个路由。路由是集成逻辑,它定义了数据在 Camel 上下文中如何从一个端点流向另一个端点。
端点
端点是系统可以发送或接收消息的通道的端点。这就是我们在通信语言中所说的目的地或源。
组件
组件是 Camel 中的扩展点。组件可以是技术、数据格式、转换器等的接口。它们还可以充当端点的工厂。

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。

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