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

apache camel_发掘Apache Camel的力量相关推荐

  1. apache camel_使用Apache Camel进行负载平衡

    apache camel 在此示例中,我们将向您展示如何使用Apache Camel作为系统的负载平衡器. 在计算机世界中,负载平衡器是一种充当反向代理并在许多服务器之间分配网络或应用程序流量的设备. ...

  2. apache camel_学习Apache Camel –实时索引推文

    apache camel 在大多数软件开发项目中,有一点需要使应用程序开始与其他应用程序或第三方组件通信. 无论是发送电子邮件通知,调用外部api,写入文件还是将数据从一个地方迁移到另一个地方,您都可 ...

  3. apache.camel_使用Apache Camel 2.14的轻松REST端点

    apache.camel Apache Camel 最近发布了一个新版本 , 其中一些新功能由我的同事Claus Ibsen博客发布 . 您确实应该检查他的博客条目并深入研究更多细节,但是我一直希望尝 ...

  4. apache camel_探索Apache Camel Core –文件组件

    apache camel 文件轮询器是解决常见IT问题的非常有用的机制. Camel的内置file组件非常灵活,并且有许多选项可用于配置. 让我们在这里介绍一些常用用法. 轮询目录以输入文件 这是一条 ...

  5. apache camel_使用Apache Camel发布/订阅模式

    apache camel 发布/订阅是一种简单的消息传递模式,其中,发布者将消息发送到某个频道,而无需知道谁将接收消息. 然后,通道负责将消息的副本传递给每个订户. 此消息传递模型可以创建松耦合和可伸 ...

  6. 发掘Apache Camel的力量

    最近几年,ESB软件越来越受欢迎. 如果大多数人通常知道什么是ESB,那么他们很少会清楚地了解这种体系结构的不同组件的确切作用. 例如,Apache ServiceMix由三个主要组件组成:Apach ...

  7. apache camel_轻量级的开源集成:Apache Camel还是Spring集成?

    apache camel 首先,为全面披露信息,在过去的1.5年中, 我一直担任 FuseSource(现为Red Hat) 的顾问,为零售,运输,银行/金融等不同行业的大型和小型公司提供SOA和集成 ...

  8. apache ignite_使用Apache Storm和Apache Ignite进行复杂事件处理(CEP)

    apache ignite 在本文中, "使用Apache Ignite进行高性能内存计算"一书的作者将讨论使用Apache Strom和Apache Ignite进行复杂的事件处 ...

  9. apache mesos_在Twitter上使用Apache Mesos和Apache Aurora进行资源调度和任务启动

    apache mesos 播客的第23集是与Bill Farner的谈话 Bill解释了Twitter如何使用Apache Mesos和Apache Aurora在硬件上获得更多收益,并通过在整个基础 ...

最新文章

  1. pytorch nan问题
  2. DevOps笔记-01:软件交付面临的问题、软件工程的三个发展阶段、什么是DevOps?
  3. VUE初长成【部分小记】
  4. ViewPager的事件冲突的解决
  5. SAP Spartacus的用户登录请求
  6. java文件解压文件_java 文件解压缩
  7. 钢铁侠头盔制作图纸下载_如何在10分钟内制作头盔图
  8. k8s数据持久化实验
  9. 电脑文件被杀毒软件误删了怎么恢复?
  10. 企业微信老是服务器异常,添加好友提示”操作异常”,企业微信需要养号吗?...
  11. 软件开发程序员需要掌握的技术
  12. maximo跟java_maximo遇到的错误问题
  13. Python基础入门:(一)从变量到异常处理 --阿里云天池
  14. 如何下载网页上的视频?
  15. 安卓开发:怎样实时在百度地图上绘制运动轨迹?
  16. 扫盲教程:单片机IIC基础通信
  17. [原创]续一:WMI进程占用CPU过高,由Alibaba的pcUnitTest.exe文件引起
  18. C++解决猴子吃桃问题(详细)
  19. vue单文件props写法_详解Vue 单文件组件的三种写法
  20. 2007年生日祝福:宝贝,谢谢您陪伴我走过人生风风雨雨,祝您2007年生日快乐!

热门文章

  1. Hadoop入门(一)概念与单机安装
  2. 零云九歌小组KTV点歌系统简介
  3. ps中对齐,历史记录,图层
  4. hibernate注解实体类(Emp.java)
  5. sql server模糊查询、分组
  6. MyBatis中的注解
  7. spark sql uv_使用Spark Streaming SQL进行PV/UV统计
  8. idea中Gitlab项目导入导出
  9. kafak消费者从头开始消费(消费者组)
  10. jvm虚拟机内存结构_JVM体系结构101:了解您的虚拟机