- JBoss Fuse 教程
- JBoss Fuse – 首页
- JBoss Fuse - ESB 简介
- 什么是 Fuse?
- JBoss Fuse – Apache Karaf
- JBoss Fuse – Apache Camel
- JBoss Fuse – Camel 概念
- JBoss Fuse – Apache CXF
- JBoss Fuse – REST Web 服务
- JBoss Fuse – Apache AMQ
- JBoss Fuse – Camel 与 AMQ
- JBoss Fuse – Fabric
- JBoss Fuse – 子容器
- JBoss Fuse – 问题和解决方案
- JBoss Fuse 有用资源
- JBoss Fuse - 快速指南
- JBoss Fuse - 有用资源
- JBoss Fuse - 讨论
JBoss Fuse - Camel 概念
本章我们将了解不同的 Camel 概念。让我们从一个基本的例子开始,了解核心概念。
CamelContext
每个 Camel 应用至少包含一个 CamelContext。这是我们添加 Camel 路由的地方。它类似于 Spring 的ApplicationContext。
Camel context 可以被认为是一个容器,它将所有内容整合在一起。一个 Camel context 可以包含多个路由。
路由
CamelContext 可能包含一个或多个路由。路由是集成逻辑,它定义数据如何在 Camel context 中从一个端点流向另一个端点。
端点
端点是通道的终点,系统可以通过它发送或接收消息。在通信语言中,我们称之为目的地或源。
组件
组件是 Camel 的扩展点。组件可以是技术的接口、数据格式、转换器等等。它们也可以充当端点的工厂。
EIP
EIP 代表企业集成模式 (Enterprise Integration Pattern)。这些模式是针对重复出现问题的已识别和众所周知的解决方案。Camel 支持大多数企业集成模式。
基于内容的路由器
CBR 模式允许我们根据输入文件的內容来路由数据。
当我们需要根据输入正文的内容来路由值时,可以使用此模式。
下面的例子将从D:/data/input目录读取数据。读取后,它将检查data标签内的value标签的值。如果value标签包含value1,则将其发送到D:/value1;如果包含value2,则将其发送到D:/value2;如果都不包含,则将其发送到others。
<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>
接收者列表
当需要从消息正文本身检索接收者列表时,使用接收者列表模式。
在下面的例子中,消息将发送给在 customer 标签中以逗号分隔的字符串列表列出的所有接收者。
<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 如下所述。
日志 - 记录完整消息或部分消息
消息过滤器 - 过滤消息内容
重新排序器 - 按顺序获取所有标记
窃听器 - 检查正在传输的消息
Camel EIP 的完整列表及其用法可以在 Camel 的官方文档中找到 http://camel.apache.org/eip.html
Camel 中的异常处理
使用错误处理器 - 这是处理 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>
使用 Try Catch Finally
Camel 还支持 Java 风格的Try Catch Finally 块用于异常处理。
与 Java 一样,它包含以下三个块:
doTry 块包含可能生成异常的代码。
doCatch 块包含在发生异常时需要执行的代码。
doFinally 块包含必须执行的代码,无论是否发生异常。无论是否引发异常,它都将始终执行。
注意 - Mock 是测试组件,不建议用于其他目的。它是 Camel 中用于测试的组件,就像 Test driven development 中的 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