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元素的值指定是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

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

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

相关文章

css 写打印样式问题

&#xff08;1&#xff09;背景颜色打印不出来问题解决方法 background样式要加上 !important&#xff1b;color样式要加上 !important&#xff1b;-webkit-print-color-adjust: exact;然后记得浏览器打印设置里面要在“打印背景图形”前面打勾。 -webkit-print-color-adjust:…

android studio smssdk,SMSSDK for Android 配置

1.集成之前先要申请Mob的appkey与appsecret2.在Mob官网下载最新SDK&#xff0c;解压后会看到以下目录结构&#xff1a;SMSSDK下存放的是短信SDK的全部内容。3.在android studio中加入SMS的第三方库AS版本的SMSSDK目录下包含以下内容&#xff1a;MobCommons.jar&#xff1a;Mob …

linux后台不挂断运行 nohup命令

//后台常在 退出终端仍然运行 nohup python pyredis.py & nohup输出重定向到my.log nohup command > my.log 2>&1 &转载于:https://www.cnblogs.com/plxm/p/8136833.html

Ubuntu 16.04安装微信

微信没有出Linux的版本&#xff0c;但是可以通过以下方式解决&#xff1a; 1、使用网页版&#xff0c;除了没有公众号之后&#xff0c;一切都没问题&#xff0c;包括传文件等。 网页登录地址&#xff1a;https://wx.qq.com/ 2、使用第三方版本&#xff0c;只不过这个是桌面应用…

navision系统和sap区别_SAP那些事-实战篇-89-浅谈金税接口方案

以前金税接口这块一直是销售顾问在做&#xff0c;虽然和财务相关&#xff0c;也没有怎么关注。这次项目把金税接口分到了财务模块&#xff0c;结果遇到了一些问题&#xff0c;趁此机会把这块总结一下方案&#xff0c;供各位看官参考。方案1&#xff1a; 文本方案&#xff0c;这…

不变性的来龙去脉

因此&#xff0c;在我的第一篇文章中&#xff0c;我谈到了一些构建器模式&#xff0c;并提到了一个非常强大但却被忽视的概念&#xff1a;不变性。 什么是不可变类&#xff1f; 这只是一个其实例无法修改的类。 类属性的每个值都在其声明或其构造函数中设置&#xff0c;并在对…

JavaScript总结(3)

第3章 获取用户的输入 &#xff1c;script&#xff1e;10 intAprompt("请输入第一个数字","");11 intBprompt("请输入第二个数字",27);默认是2712 document.write("你输入的第一个数字是"intA);13 document.write("&#xff1c;…

css书写规范

在书写css样式的时候总是无意中就写乱了&#xff0c;无论是命名或者是样式的书写顺序&#xff0c;这里做一个总结&#xff0c;提醒自己在书写css的时候时刻注意&#xff0c;大家可以参考哈。 1. 样式属性顺序 单个样式规则下的属性在书写时&#xff0c;应按功能进行分组&…

android 协程,关于android:Kotlin协程实现原理SuspendCoroutineContext

明天咱们来聊聊Kotlin的协程Coroutine。如果你还没有接触过协程&#xff0c;举荐你先浏览这篇入门级文章What? 你还不晓得Kotlin Coroutine?如果你曾经接触过协程&#xff0c;置信你都有过以下几个疑难&#xff1a;协程到底是个什么货色&#xff1f;协程的suspend有什么作用&…

清空easyui checkbox选中项

$(#dg).datagrid(unselectAll);转载于:https://www.cnblogs.com/douhuan/p/7116744.html

python 编辑excel需要什么包_Python 中操作EXCEL表格的包

今天&#xff0c;马云爸爸又来贡献金句了&#xff0c;比王健林公公一亿一个小目标还高&#xff0c;“一个月挣一二十个亿很难受&#xff01;&#xff01;&#xff01;”&#xff0c;作为在传统企业主要为电商部门提供数据分析的数据分析师&#xff0c;体验太深刻了。双11前后&a…

用Java处理大文件

最近&#xff0c;我不得不处理一组包含逐笔历史汇率市场数据的文件&#xff0c;并很快意识到使用传统的InputStream都无法将它们读取到内存中&#xff0c;因为每个文件的大小都超过4 GB。 Emacs甚至无法打开它们。 在这种特殊情况下&#xff0c;我可以编写一个简单的bash脚本&…

java IO(一):File类

1.File类简介 File类位于java.io包中。它面向文件层次级别操作、查看文件&#xff0c;而字节流、字符流操作数据时显然比之更底层。 学习File类包括以下几个重点&#xff1a;文件路径、文件分隔符、创建文件(目录)、删除文件(目录)、查看文件内容(输出目录内文件)、判断文件(是…

android listview 开发,android开发之ListView实现

今天又初步学习了一下ListView控件&#xff0c;看看效果如下&#xff1a;LisViewActivity.java源码&#xff1a;package com.jinhoward.UI_listview;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.os.Bundl…

input ios问题 小程序_微信小程序开发常见问题汇总

原标题&#xff1a;微信小程序开发常见问题汇总1、域名必须是https非https的域名不被微信小程序允许。2、input组件placeholder字体颜色卸载placeholder-class里面的color并不生效&#xff0c;需要写在placeholder-style里面就可以了。3、wx.navigateTo无法跳转到带tabbar的页面…

https://github.com/

https://github.com/ qq邮箱 转载于:https://www.cnblogs.com/chang1/p/7133251.html

Less 的用法

1. node.js node.js是一个前端的框架 自带一个包管理工具npm node.js 的安装 官网&#xff1a;http://nodejs.cn/ 在命令行检验是否安装成功 切换到项目目录&#xff0c;初始化了一个package.json文件 安装与卸载jQuery包&#xff08;例子&#xff09; 安装 卸载 安装淘宝…

浅谈springboot整合ganymed-ssh2远程访问linux

环境介绍 技术栈 springbootmybatis-plusmysqlganymed-ssh2 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 SSH(远程连接工具)连接原理&#xff1a;ssh服务是一个守护进程(demon)&#xff0c;系统后台监听客户…

优化Neo4j Cypher查询

上周&#xff0c;我花了很多时间尝试使用实时系统中的数据来优化大约20个执行失败的Cypher查询&#xff08;36866ms至155575ms&#xff09;。 经过一番尝试和错误&#xff0c;以及来自Michael的大量投入&#xff0c;我能够大致确定对查询进行哪些操作才能使它们性能更好-最后&a…

python 多文件知识

对于一个大型的项目&#xff0c;会存在很多个py文件&#xff0c;本文记录与多文件有关的内容。 1. python 如何在一个.py文件中调用另一个.py文件的类 如果是在同一个 module中(也就是同一个py 文件里),直接用就可以如果在不同的module里,例如a.py里有 class A:b.py 里有 class…