Jboss Fuse 简明教程
JBoss Fuse - Camel Concepts
在本章中,我们将理解不同的 Camel 概念。让我们从举一个基本示例开始,首先了解核心概念。
CamelContext
每个 camel 应用程序至少具有一个 CamelContext。这是我们添加 camel 路由的位置。它类似于 Spring 的 ApplicationContext 。
Camel context 可以被认为是将所有内容组合在一起的容器。一个 camel context 可以容纳多个路由。
EIP
EIP 代表企业集成模式。这些是针对重复出现的问题而确定的众所周知的解决方案。Camel 支持大多数企业集成模式。
Content Based Router
CBR 模式允许我们根据输入文件的内容路由数据。
当我们必须根据输入正文的内容路由值时,将使用此模式。
以下示例将从 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
拆分模式用于将输入数据拆分成更小的块。
此模式通常用于大的数据输入,需要将其拆分成块,以便于处理。它根据输入令牌字符串将输入分解为更小的片段。
<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
当需要从消息正文中检索收件人列表时,将使用收件人列表模式。
在以下示例中,将向作为逗号分隔字符串列表列在 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 如下所述。
-
Log − 记录消息全部或部分内容
-
Message Filter − 过滤消息内容
-
Re-Sequencer − 获取序列中的所有令牌
-
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 一样,它有以下三个块:
-
doTry 块包含可能生成异常的代码。
-
doCatch 块包含在异常情况下需要执行的代码。
-
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 块处理的异常列表。