apache camel_发掘Apache Camel的力量

apache camel

最近几年,ESB软件越来越受欢迎。 如果大多数人通常知道什么是ESB,那么他们很少会清楚地了解这种体系结构的不同组件的确切作用。

例如,Apache ServiceMix由三个主要组件组成:Apache Karaf(OSGI容器),Apache ActiveMQ(消息代理)和Apache Camel。 顺便问一下,骆驼到底是什么? 什么是“ routing and mediation engine ”? 有什么用?

我已经与Camel一起工作了大约一年,我认为-尽管根本不是Camel专家,但我现在有足够的后见之明,可以使用一些非常具体的示例让您发现Camel的兴趣和力量。为了清楚起见,在本文的其余部分中,我将使用Spring DSL –假设读者熟悉Spring语法。

用例

让我们想象一下,我们想使用Camel实现以下场景。 产品信息请求将以平面文件(CSV格式)的形式发送到特定文件夹中。 该文件的每一行都包含特定客户关于特定汽车型号的单个请求。 我们要向这些客户发送有关他们感兴趣的汽车的电子邮件。为此,我们首先需要调用Web服务以获取其他客户数据(例如,他们的电子邮件)。 然后,我们必须从数据库中获取汽车特性(让我们说一个文本)。 由于我们希望邮件看起来像样(例如HTML),因此也需要进行小的文本转换。

当然,我们不希望仅对请求进行顺序处理,而是希望引入一些并行性。 同样,我们也不想多次将完全相同的邮件发送给不同的客户(而是将相同的唯一邮件发送给多个收件人)。 利用我们后端的集群功能来平衡对Web服务的调用也将是一件很不错的事情。 最后,在处理请求失败的情况下,我们希望以某种方式跟踪原始请求,以便例如可以通过邮政发送。

一个(可能的)骆驼实现:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://camel.apache.org/schema/springhttp://camel.apache.org/schema/spring/camel-spring.xsd "
><camelContext xmlns="http://camel.apache.org/schema/spring" errorHandlerRef="myDLQ"><!-- 2 redeliveries max before failed message is placed into a DLQ   --><errorHandler id="myDLQ" type="DeadLetterChannel" deadLetterUri="activemq:queue:errors" useOriginalMessage="true"><redeliveryPolicy maximumRedeliveries="2"/></errorHandler><!-- The polling of a specific folder every 30 sec --><route id="route1"><from uri="file:///Users/bli/folderToPoll?delay=30000&delete=true"/><unmarshal><csv/></unmarshal><split><simple>${body}</simple><setHeader headerName="customerId"><simple>${body[1]}</simple></setHeader><setHeader headerName="carModelId"><simple>${body[2]}</simple></setHeader><setBody><simple>${body[0]}</simple></setBody><to uri="activemq:queue:individualRequests?disableReplyTo=true"/></split></route><!-- The consumption of individual (jms) mailing requests --><route id="route2"><from uri="activemq:queue:individualRequests?maxConcurrentConsumers=5"/><pipeline><to uri="direct:getCustomerEmail"/><to uri="direct:sendMail"/></pipeline></route><!-- Obtain customer email by parsing the XML response of a REST web service --><route id="route3"><from uri="direct:getCustomerEmail"/><setBody><constant/></setBody><loadBalance><roundRobin/><to uri="http://backend1.mycompany.com/ws/customers?id={customerId}&authMethod=Basic&authUsername=geek&authPassword=secret"/><to uri="http://backend2.mycompany.com/ws/customers?id={customerId}&authMethod=Basic&authUsername=geek&authPassword=secret"/></loadBalance><setBody><xpath resultType="java.lang.String">/customer/general/email</xpath></setBody></route><!-- Group individual sendings by car model --><route id="route4"><from uri="direct:sendMail"/><aggregate strategyRef="myAggregator" completionSize="10"><correlationExpression><simple>header.carModelId</simple></correlationExpression><completionTimeout><constant>60000</constant></completionTimeout><setHeader headerName="recipients"><simple>${body}</simple></setHeader><pipeline><to uri="direct:prepareMail"/><to uri="direct:sendMailToMany"/></pipeline></aggregate></route><!-- Prepare the mail content --><route id="route5"><from uri="direct:prepareMail"/><setBody><simple>header.carModelId</simple></setBody><pipeline><to uri="sql:SELECT xml_text FROM template WHERE template_id =# ?dataSourceRef=myDS"/><to uri="xslt:META-INF/xsl/email-formatter.xsl"/></pipeline></route><!-- Send a mail to multiple recipients --><route id="route6"><from uri="direct:sendMailToMany"/><to uri="smtp://mail.mycompany.com:25?username=geek&password=secret&from=no-reply@mycompany.com&to={recipients}&subject=Your request&contentType=text/html"/><log message="Mail ${body} successfully sent to ${headers.recipients}"/></route></camelContext><!-- Pure Spring beans referenced in the various Camel routes --><!-- The ActiveMQ broker --><bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent"><property name="brokerURL" value="tcp://localhost:61616"/></bean><!-- A datasource to our database --><bean id="myDS" class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName" value="org.h2.Driver"/><property name="url" value="jdbc:h2:file:/Users/bli/db/MyDatabase;AUTO_SERVER=TRUE;TRACE_LEVEL_FILE=0"/><property name="username" value="sa"/><property name="password" value="sa"/></bean><!-- An aggregator implementation --><bean id="myAggregator" class="com.mycompany.camel.ConcatBody"/></beans>

和(仅!)Java类的代码:

public class ConcatBody implements AggregationStrategy {public static final String SEPARATOR = ", ";public Exchange aggregate(Exchange aggregate, Exchange newExchange) {if (aggregate == null) {// The aggregation for the very exchange item is the exchange itselfreturn newExchange;} else {// Otherwise, we augment the body of current aggregate with new incoming exchangeString originalBody = aggregate.getIn().getBody(String.class);String bodyToAdd = newExchange.getIn().getBody(String.class);aggregate.getIn().setBody(originalBody + SEPARATOR + bodyToAdd);return aggregate;}	}}

一些解释

  • route1 ”处理传入的平面文件。 首先将文件内容解组(使用CSV格式),然后将其拆分为行/记录。 每行都将变成发送到JMS队列的单独通知。
  • route2 ”正在使用这些通知。 基本上,完成一个请求意味着依次执行两件事(“管道”):获取客户电子邮件(route3)并向他发送邮件(route4)。 请注意“ maxConcurrentConsumers”参数,该参数用于轻松满足我们的并行性要求。
  • route3 ”对如何获取客户电子邮件进行建模:只需通过解析(使用XPath)两个后端节点上可用的(安全的)REST Web服务的XML响应即可。
  • route4 ”包含发送大量邮件的逻辑。 每次收集到10个类似的发送请求(在我们的示例中,是对同一辆汽车的10个请求)(并且我们不准备等待超过1分钟),我们希望整个过程以新消息继续进行(或骆驼术语中的“交换”是10条组合消息的串联。 继续该过程意味着:首先准备邮件正文(路由5),然后将其发送到组(路由6)。
  • 在“ route5 ”中,发出SQL查询,以便根据汽车型号获得适当的文本。 在该结果上,我们应用了一个小的XSL-T转换(它将用xsl转换的输出替换当前交换主体)。
  • 当输入“ route6 ”时,交换包含我们需要的一切。 我们有收件人列表(作为标题),还有(正文中)要发送的html文本。 因此,我们现在可以继续使用SMTP协议进行实际发送。
  • 如果出现错误(例如临时网络问题)–在整个过程中的任何地方,Camel都会在放弃之前最多进行两次其他尝试。 在后一种情况下,始发消息将由Camel自动放置到JMS死信队列中。

结论

骆驼确实是一个很棒的框架-并非完美,但仍然很棒。 您会惊讶地看到,只需几行代码即可对复杂的场景或路线进行建模。 您也可能很高兴看到您的代码多么清晰,同事们能够多快地理解您的路线逻辑。

但这当然不是主要优势。 使用Camel主要是邀请您考虑企业集成模式(又称“ EIP”); 它可以帮助您使用众所周知的成熟技术将原始复杂性分解为不太复杂(可能是并发)的子路由,从而实现更模块化,更灵活的实现。 特别是,使用去耦技术可以简化解决方案中单个零件或组件的替换或重构。

参考:从我们的W4G合作伙伴 Bernard Ligny中 发现Apache Camel的功能 。

翻译自: https://www.javacodegeeks.com/2012/12/discovering-the-power-of-apache-camel.html

apache camel

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

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

相关文章

角反射器的功能及应用

雷达反射器又名角反射器&#xff0c;它是通过金属板材根椐不同用途做成的不同规格的雷达波反射器。当雷达电磁波扫描到角反射后&#xff0c;电磁波会在金属角上产生折射放大&#xff0c;产生很强的回波信号&#xff0c;在雷达的屏幕上出现很强的回波目标。由于角反射器有极强的…

mysql卸载权限不够_Linu下启动MySQL结果显示:env: /etc/init.d/mysql:权限不够怎么解决?...

展开全部Linu下启动MySQL结果显示&#xff1a;env: /etc/init.d/mysql: 是脚本执行的问题解决办法&#xff1a;依次e69da5e887aa3231313335323631343130323136353331333365633936执行下面的命令(执行失败的话&#xff0c;检查路径是否正确)&#xff1a;cp /etc/init.d/mysql /e…

GDAL/ORG之Python获取与安装

GDAL(Geospatial Data Abstraction Library)是一个的开源栅格空间数据读取/转换库。其中还有一系列命令行工具来进行数据转换和处理。而ORG项目是GDAL的一个分支&#xff0c;功能与GDAL类似&#xff0c;但其提供对矢量数据的支持。 也就是说&#xff0c;可以用ORG的库来读取、处…

Firewall配置

一、安装firewall #yum install -y firewalld firewall-config 二、启动并设置开机自启动# systemctl start firewalld# systemctl enable firewalld# systemctl stop firewalld# systemctl disable firewalld 三、firewall配置# firewall-config 防火墙图形配置界面# firewall…

网页cookie是什么?

Cookie 是用户访问的网站创建的文件&#xff0c;存储在用户电脑的硬盘中&#xff0c;用于保存浏览信息&#xff0c;例如您的网站偏好设置或个人资料信息。网站依靠Cookie辨认用户行踪&#xff0c;了解用户感兴趣内容&#xff0c;收集与用户有关的信息。用户访问查询网页上操作信…

使用基于微服务的流架构更好地进行大规模的复杂事件处理(第1部分)

基于微服务的流架构与开源规则引擎相结合&#xff0c;使实时业务规则变得容易 这篇文章旨在详细说明我将OSS业务规则引擎与Kafka风格的现代流消息传递系统集成在一起的项目。 该项目的目标&#xff08;即众所周知的复杂事件处理&#xff08;CEP&#xff09;&#xff09;旨在实…

chown r mysql ._chown -R 用户名:组名 ./ 及 chown用法介绍

当我们在不通过yum(CentOS)、apt-get(Ubuntu)来安装MySQL的时候&#xff0c;通常执行以下命令来改变目录的拥有者&#xff1a;[rootlocalhost ~]# chown -R mysql:mysql ./这两个mysql谁是用户名谁是用户组呢&#xff1f;见chown详解。chown将指定文件的拥有者改为指定的用户或…

c语言abs和fabs的区别是什么?

abs是整数取绝对值&#xff0c;定义在stdlib.h头文件中。而fabs是指浮点数取绝对值&#xff0c;定义在math.h头文件中。 函数原型 int abs(int x) double fabs(double x)

Linux下编译GDAL

一、准备工作 从官网下载GDAL、PROJ.4和GEOS&#xff0c;将其存放在/home/liml/Work/3rdPart目录并解压&#xff0c;如下图所示。下载地址请自行Google。注&#xff1a;使用的系统是CentOS6.4 X64版本&#xff0c;其他的Linux系统都是一样的。 接下来检查系统中是否安装了开发…

PS提示错误1解决办法

重装电脑系统后&#xff0c;PS打不开了&#xff0c;提示错误1.在网上搜索&#xff0c;很多网友说要卸载重装。控制面板看不到ps&#xff0c;于是下载了Adobe卸载工具&#xff08;点击链接下载&#xff09;&#xff0c;但是这个程序识别不了安装的ps.最后通过以下办法解决。 1.…

如何为你的博客园添加到百度统计

1.打开百度统计的地址 https://tongji.baidu.com/web/welcome/login?castkLTE%3D 2.注册&#xff0c;打开网址后&#xff0c;右面有注册按钮&#xff0c;点击注册 选择站长版&#xff0c;点击去 填写自己的注册信息 3.填完之后&#xff0c;登录进去&#xff0c;在管理标签下有…

mysql 左连接 重复_mysql左连接重复行

我正在设计一个类似于4个表格的字典数据库wordswordid | lemmasenseswordid | synsetidsynsetssynsetid | definitionsamplessynsetid | sample所以我使用下面的查询来获取所有意义定义和样本if(isset($searchterm)){echo "".$searchterm."";// QUERY TO F…

osgi java_使普通的旧Java OSGi兼容

osgi java尽管OSGi在Java世界中越来越流行&#xff0c;但仍有许多Java应用程序和库尚未设计成可在OSGi中使用。 有时您可能需要在OSGi环境中运行这样的代码&#xff0c;或者是因为您想利用OSGi本身提供的好处&#xff0c;或者因为您只需要此特定环境提供的某些功能。 通常&…

Matlab如何求离散点的导数

1.通过差分估算 已知同维度的x和y序列&#xff0c;则可使用diff(y)./diff(x)来估算。设x为n维向量&#xff0c;Dxdiff(x) 计算向量x的向前差分&#xff0c;DX(i)X(i1)-X(i)&#xff0c;0<i<n。 例一 y[7.86 7.84 7.82 7.77 7.72 7.68 7.61 7.51 7.42 7.33 7.21 7.07 6…

ERROR 6: GEOS support not enabled.

要学习GEOS库&#xff0c;肯定绕不开地理方面的东西。如果需要判断的两个多边形或几何图形&#xff0c;不是自己创建的&#xff0c;而是来自shapefile文件&#xff0c;那就得将GEOS库和GDAL/OGR库结合使用了。实际上只需要OGR就行了&#xff0c;但OGR和GDAL是放在一起的。OGR库…

java面向对象(this关键字)

一.this的作用 1.this 相当于是指向当前对象本身 2.成员变量和局部变量同名问题 class Person {private int age;private String name;// 给姓名和年龄初始化的构造方法Person(String name, int age) {// 当需要访问成员变量是&#xff0c;只需要在成员变量前面加上this.即可th…

c语言float二进制输出代码_下面C语言中这十四大谜题,不看答案你能做出来吗?...

C语言领取福利资料前往文末领取本篇文章《C语言的谜题》展示了14个C语言的迷题以及答案&#xff0c;代码应该是足够清楚的&#xff0c;而且我也相信有相当的一些例子可能是我们日常工作可能会见得到的。通过这些迷题&#xff0c;希望你能更了解C语言。如果你不看答案&#xff0…

平台策略:从Portlet到OpenSocial小工具再到渐进式Web应用程序:最新技术

介绍 由于世界仍在Java的掌控之中&#xff0c;因此我们经常定义所谓的基于组件的平台 。 我在2000年的OpenUSS&#xff08;开放大学支持系统&#xff09;方面拥有这一经验。 当时我有一个想法&#xff0c;就是开发一个可以使用组件体系结构和J2EE技术​​&#xff08; OpenUSS …

webm文件怎么在手机上正常播放以及在电脑上转换为mp4格式!

webm是一个开放、免费的媒体文件格式。WebM影片格式是以Matroska&#xff08;即MKV&#xff09;容器格式为基础开发的新容器格式&#xff0c;里面包括了VP8影片轨和Ogg Vorbis音轨&#xff1b;其中Google将其拥有的VP8视频编码技术以类似BSD授权开源&#xff0c;而Ogg Vorbis本…

WKT介绍

WKT&#xff0c;是一种文本标记语言&#xff0c;用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。它的二进制表示方式&#xff0c;亦即WKB(well-known binary)则胜于在传输和在数据库中存储相同的信息。该格式由开放地理空间联盟(OGC)制定。 目录 1概念2几何对象…