在先前的博文中,我们了解了企业集成模式(EIP)。 现在,在这篇文章中,我们将研究实现这些模式的Apache Camel框架。
关于骆驼:
Apache Camel是一个开放源代码项目,已有将近5年的历史,并且拥有大量的用户社区。 该框架的核心是一个引擎,它负责中介工作并将消息从一个系统路由到另一个系统。 在外围,它具有大量的组件,可以与使用各种协议(例如FTP,RPC,Webservices,HTTP,JMS,REST等)的系统进行接口。 它还提供了Java,Spring和Scala中易于理解的领域特定语言。
现在让我们开始使用Apache骆驼。 我们将使用maven设置一个项目,为所需的骆驼库添加依赖项,并使用Java和Spring DSL编写示例。
考虑一个接受两种类型订单的系统。 小部件和小工具。 订单到达JMS队列并以XML格式指定。 小工具清单会轮询文件目录中的传入订单,而小部件清单会在队列上侦听。 我们对所有到达的订单运行XPath,并确定它们是属于小部件还是小工具库存。 下图描述了我们的用例:
首先,只需在目录中打开命令行窗口,然后键入mvn archetype:generate
"c:\myprojects>mvn archetype:generate
假设我们的路径中有maven 2+和jdk 1.6版本,同样要运行此示例,我们需要一个activemq代理。
我们将在pom中添加以下依赖项
org.apache.camel : camel-core : 2.10.1
- Lib containing Camel engineorg.apache.camel : camel-ftp : 2.10.1
- Camel's ftp componentorg.apache.activemq : activemq-camel : 5.6.0
org.apache.activemq : activemq-pool : 5.6.0
- Libs required to integrate camel with activemqlog4j : log4j : 1.2.16
org.slf4j : slf4j-log4j12 : 1.6.4
- Libs for logging
完整的pom.xml粘贴在该要点条目上。
现在,让我们的骆驼路线编码,该路线将轮询JMS队列,应用XPath找出该订单是用于小工具清单还是窗口小部件清单,然后将其路由到FTP目录或JMS队列。
到达我们系统的订单具有以下结构
<xml version="1.0" encoding="UTF-8"> <order><product>gadget</product><lineitems><item>cdplayer</item><qty>2</qty></lineitems><lineitems><item>ipod-nano</item><qty>1</qty></lineitems>
</order>
product元素的值指定是gadget还是小部件订单。 因此,在订单的XPath下方应用将使我们决定将该消息路由到的位置。/order/product=“ gadget”,然后转发至FTP目录,否则转发至队列。
现在让我们对路由进行编码,为此,需要扩展RouteBuilder(org.apache.camel.builder.RouteBuilder)类并覆盖它的configure方法。 我们将类命名为JavaDSLMain,并将以下代码放入其configure方法中:
from("activemq:queue:NewOrders?brokerURL=tcp://192.168.64.144:61616").choice().when(xpath("/order/product = 'gadget'")).to("activemq:queue:GadgetOrders?brokerURL=tcp://192.168.64.144:61616").otherwise().to("ftp://192.168.101.3/camel-demo?username=admin&password=admin&binary=true");
这样做之后,现在让我们分析以上路线。 上面的关键字构成了骆驼EIP DSL; 该路线的目的总结如下:
from :这表示从端点获取消息,即consume ,在我们的情况下,这恰好是一个队列。
选择 :这是一个谓词,在这里我们应用一个简单的规则。
xpath :这表示将xpath应用于当前消息,xpath的结果为布尔值。 到 :这告诉骆驼将消息放在端点上,即产生 。
每个关键字都可以使用一些参数来工作。 例如,from采取端点参数来消费消息,在本例中,它是JMS(activemq)代理上的队列。
注意,Camel会自动为您进行类型转换,在上述路由中,在应用XPath之前,消息对象已转换为DOM。
我们还将main方法放入此类本身,以快速对其进行测试。 在main方法内部,我们需要实例化一个Camel上下文,该上下文将承载此路由,并且在启动上下文时,Camel将设置路由并开始侦听NewOrders队列。
main方法中包含的代码如下:
CamelContext camelContext = new DefaultCamelContext();
camelContext.addRoutes(new JavaDSLMain());
camelContext.start();
/* wait indefinitely */
Object obj = new Object();
synchronized (obj) {
obj.wait();
}
查看此要点条目以获取完整的代码清单。
使用Camel的另一种方法是使用Spring,Camel路由进入Spring应用程序上下文文件。 我们只使用XML来快速定义路由,而不是编写Java代码。 为此,我们需要在Spring上下文文件中导入Camel名称空间并使用
诸如Spring工具套件之类的IDE可以快速构建和编写集成应用程序。
在这个gist条目中检查展示Camel路由的Spring应用程序上下文。将该上下文文件放在META-INF / spring文件夹中,即在我们的maven项目中,它位于/ src / main / resources / META-INF / spring文件夹下。
在顶部,我们导入了Camel的Spring命名空间,该命名空间允许在Spring的应用程序上下文中定义Camel路由,此外,在我们的pom文件中,我们需要添加依赖项以包含Spring bean的依赖关系,以在Spring中识别和实例化Camel引擎。 在下面添加以包括对Spring的Camel支持。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring</artifactId>
<version>2.10.1</version></dependency>
Camel提供了一个帮助程序类(org.apache.camel.spring.Main),它可以扫描保存在下面的所有Spring应用程序上下文文件。
META-INF / spring文件夹保存在类路径下。 检查显示所需代码的要点条目。 通过这个示例,我们实现了基于内容的路由器模式,该模式检查消息的内容以进行路由决策。
参考:来自NS.Infra博客的JCG合作伙伴 Abhishek Jain的Apache Camel入门 。
翻译自: https://www.javacodegeeks.com/2012/12/getting-started-with-apache-camel.html