apache camel_Apache Camel入门

apache camel

在先前的博文中,我们了解了企业集成模式(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元素的值指定是小工具订单还是小工具订单。 因此,在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应用程序上下文文件。 不用编写Java代码,我们只使用XML来快速定义路由。 为此,我们需要在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

apache camel

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++拷贝构造函数详解

一. 什么是拷贝构造函数 首先对于普通类型的对象来说&#xff0c;它们之间的复制是很简单的&#xff0c;例如&#xff1a; [c-sharp] view plaincopyint a 100; int b a; 而类对象与普通对象不同&#xff0c;类对象内部结构一般较为复杂&#xff0c;存在各种成员变量。 …

mysql经典总结文章_MySQL基础篇(01):经典实用查询案例,总结整理

一、连接查询图解示意图1、建表语句部门和员工关系表&#xff1a;CREATE TABLE tb_dept (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键ID,deptName varchar(30) DEFAULT NULL COMMENT 部门名称,PRIMARY KEY (id)) ENGINEInnoDB AUTO_INCREMENT6 DEFAULT CHARSETutf8;CREAT…

针对故障场景的血液,汗液和书写自动集成测试

去年冬天&#xff0c;我为仍在工作的客户编写并发布了一项服务。 总体而言&#xff0c;该服务满足了业务需求和性能要求&#xff0c;但是使用该服务的一个团队告诉我&#xff0c;他们定期遇到一个问题&#xff0c;该问题是该服务将返回500个错误&#xff0c;并且在重新启动该服…

java 8 update 11_从Java 8升级到Java 11应该注意的问题

从 Java 8迁移到Java 11比大多数升级更棘手。以下是这个过程的一些注意事项。模块在Java 9中Java引入了历史上最大的变化之一 是模块&#xff0c;但&#xff1a;不必将你自己的代码模块化以后才能升级到Java 11。在大多数情况下&#xff0c;放在类路径classpath上的代码能继续在…

标签树的三种遍历

一、标签树的下行遍历 属性说明.contents子节点的列表&#xff0c;将<tag>所有儿子节点存入列表中&#xff08;只能获取下一级儿子节点&#xff09;.children子节点的迭代类型&#xff0c;与.contents类似&#xff0c;用于循环遍历儿子节点.descendants子孙节点的迭代类型…

Git 使用规范流程

团队开发中&#xff0c;遵循一个合理、清晰的Git使用流程&#xff0c;是非常重要的。 否则&#xff0c;每个人都提交一堆杂乱无章的commit&#xff0c;项目很快就会变得难以协调和维护。 下面是ThoughtBot 的Git使用规范流程。我从中学到了很多&#xff0c;推荐你也这样使用Git…

oracle安装静默

安装环境&#xff1a;centos71、修改主机名 /etc/sysconfig/network#HOSTNAMEoracledb.012、修改ip和对应的主机名 /etc/hosts#10.5.1.190 oracledb.013、关闭Selinux /etc/selinux/config#SELINUXdisabled4、参考官方文档安装依赖的软件包 binutils-2.23.52.0.1-12.el7.x86_64…

[MEGA DEAL] Ultimate Java开发和认证指南(59%折扣)

通过介绍世界上最受欢迎的编程语言之一掌握Java编程概念 嘿&#xff0c;怪胎&#xff0c; 本周&#xff0c;在我们的JCG Deals商店中 &#xff0c;我们提供了一个极端的报价 。 我们提供的《 Ultimate Java Development and Certification Guide 》 仅售20美元&#xff0c;而…

python浅拷贝的说法_Python中List的复制(直接复制、浅拷贝、深拷贝)

直接赋值&#xff1a;如果用 直接赋值&#xff0c;是非拷贝方法。这两个列表是等价的&#xff0c;修改其中任何一个列表都会影响到另一个列表。old [1,[1,2,3],3]new []for i in range(len(old)):new.append(old[i])new[0] 3new[1][0] 3-----------------------Before:[1,…

AliOS-Things Visual studio code helloworld 入门

配置环境的时候别忘了下载&#xff1a;GCC工具链&#xff1a;https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads AliOS Things 完成第一个应用&#xff1a;Hello World 全局掌控 从Git上下载源码用VSCode打开源码&#xff0c;查看源码的目录结构打开Hello…

java 联网_java网络

这个图很形象的展示了OSI的五层架构之间的关系。OSI被称为开放式互联&#xff0c;是国际标准组织制定的网络模型&#xff0c;本来是七层&#xff0c;后来把表现层和会话层加到应用层里面了。那么五层模型中的每一层具体都是干什么的呢&#xff1f;在标准的网络模型中&#xff0…

[小米OJ] 4. 最长连续数列

思路&#xff1a; 时间限制为O(n)&#xff0c;即不能使用先排序后寻找的方法。 这里利用哈希表查询插入复杂度都为O(1)的特性来解&#xff0c;利用一个哈希表来保存每一个数字以及其所在数列的长度。 遍历每一个数字n&#xff1a;查询表中是否存在n-1和n1&#xff0c;若存在&am…

控制反转

控制反转[编辑] 维基百科&#xff0c;自由的百科全书控制反转&#xff08;Inversion of Control&#xff0c;缩写为IoC&#xff09;&#xff0c;是面向对象编程中的一种设计原则&#xff0c;可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入&#xff08;Depe…

使用Mutability Detector对Java数据类的不变性进行单元测试

在我们所有的项目中&#xff0c;我们使用的数据类根据定义包含数据&#xff08;字段&#xff09;&#xff0c;但不包含&#xff08;业务&#xff09;逻辑。 根据最佳编码实践&#xff0c;数据类最好应该是不可变的&#xff0c;因为不可变性意味着线程安全。 这里的主要参考是J…

三种单例模式的C++实现

简介 因为在设计或开发中&#xff0c;肯定会有这么一种情况&#xff0c;一个类只能有一个对象被创建&#xff0c;如果有多个对象的话&#xff0c;可能会导致状态的混乱和不一致。这种情况下&#xff0c;单例模式是最恰当的解决办法。它有很多种实现方式&#xff0c;各自的特性不…

centos安装Redis

vRedis的安装 ♛ 1.0 下载Rediswget http://download.redis.io/releases/redis-5.0.2.tar.gz ♛ 1.1 解压tar -zxvf redis-5.0.2.tar.gz ♛ 1.2 安装gcc依赖Redis是C实现的&#xff0c;需要gcc来进行编译&#xff0c;先安装gcc。 yum install gcc ♛ 1.3 打开Redis目录cd redis…

maven插件编写_编写Maven插件的提示

maven插件编写最近&#xff0c;我花了很多时间为Maven编写插件或在其中工作。 它们简单&#xff0c;有趣且有趣。 我以为我会分享一些技巧&#xff0c;使编写它们时的生活更轻松。 提示1&#xff1a;将任务与Mojo分开 最初&#xff0c;您将把mojo的所有代码放入mojo的类&…

e3是合法浮点数吗_下列哪些是不合法的浮点数的选项是 123 2e4.2 .e5 -e3 .234 1e3

共回答了16个问题采纳率&#xff1a;93.8%浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数.具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法.由此可以看出…

VC的Win32控制台程序中使用MFC库文件

如果想要在VC中的Win32控制台程序中使用CString类&#xff0c;应注意下列情况&#xff1a; 1.必须包含头文件#include <afx.h> 2.Project ----settings... ----General---- Microsoft Foundation Classes: Use MFC in a Shared DLL

java能否调用com_java调用com

一、C#写com组件开发环境 vs20051、新建工程:ClassLibrary1 //根据自己需要取工程名2、右键点击工程->应用程序->程序集信息->使程序集com可见&#xff0c;打上勾右键点击工程->生成->为com Interop注册 打上勾3、设置强签名打开Visual Studio Command Pr…