Apache Camel简介

Apache Camel是著名的企业集成模式的开源实现。 Camel是一个路由和中介引擎,可以帮助开发人员以各种领域特定语言(DSL)(例如Java,Spring / XML,scala等)创建路由和中介规则。

骆驼用途广泛

Camel使用URI来支持大量的传输和消息传递模型,例如HTTP,JMS,JBI,Mina,SCA,CXF,它还与外部组件和数据格式很好地兼容。 要了解Camel的多功能性,您可以在下面的链接中浏览其支持的组件和URI列表。 http://camel.apache.org/components.html

骆驼易于使用

骆驼允许我们使用同一组API来创建路由并在各个组件之间传递消息。 这使得它非常容易使用

单元测试骆驼轻而易举

单元测试对于编写任何质量代码至关重要。 骆驼使软件开发的基础变得非常容易。 它提供了许多现成的组件,例如CamelContextSupport,camel-guice,camel-test-blueprint,可轻松测试代码。 在以后的文章中会更多。

骆驼的术语/类/接口

端点是交换消息的地方。 它可以引用地址,POJO,电子邮件地址,Web服务uri,队列uri,文件等。在骆驼中,端点是由实现的端点接口实现的。 端点被称为路由的东西包装。

CamelContext是所有骆驼应用程序的核心,它代表Camel运行时系统。

  1. 创建camelcontext。
  2. 添加端点或组件。
  3. 添加路由以连接端点。
  4. 调用camelcontext.start()–这将启动所有负责在端点中接收,发送和处理消息的骆驼内部线程。
  5. 最后,在交换和处理所有消息时调用camelcontext.stop()。 这将优雅地停止所有骆驼内部线程和端点。

这是围绕CamelContext对象的薄包装,它负责将交换或消息发送到端点。

组件实际上是一个端点工厂。 由于骆驼支持许多不同种类的资源,因此这些资源中的每一个都有不同种类的端点。 在实际情况下,应用程序不要直接使用组件创建端点。 相反,CamelContext决定实例化哪个组件,然后使用该组件实例创建端点。 因此,在应用程序中我们将拥有。 CamelContext.getEndpoint(“ pop3://john.smith@mailserv.example.com?password = myPassword”); 现在,在这种情况下,pop3是组件的名称。 CamelContext将所有组件名称与组件类映射,并使用其实例化实例的名称。 一旦拥有了组件的句柄,它就会通过调用实例化端点。 Component.createInstance()方法。

消息表示单个具体消息,即请求,回复或异常。 所有具体的消息类都会影响消息接口,例如JmsMessage类。

交换是消息的容器。 当消费者在路由过程中收到消息时创建。

处理器接口表示处理消息的类。 它包含单个方法public void process(Exchange交换)引发异常。应用程序开发人员可以实现此接口,以在消费者收到消息时对消息执行业务逻辑。

路由是通过过滤器或路由器通过任意类型的决策,将消息从源一步一步地移动到目的地。 它们是借助DSL(特定于域的语言)进行配置的。 Java DSL是通过实现routebuilder接口创建的。 它具有一个称为configure()的方法,该方法定义了消息的整个路由。 也可以使用spring通过xml文件配置路由。

骆驼代码的一个小例子。

让我们以一个小例子来说明一下Camel可以做什么。 在此示例中,我们将文件夹中存在的文件组移动到另一个文件夹。 在此过程中,我们将执行以下操作

  1. 签出Camel的依赖项。
  2. 创建一个简单的RouterBuilder。
  3. 在spring文件中注册CamelContext。
  4. 在CamelContext Bean中注入routerbuilder
  5. 通过启动Camelcontext来执行该类,并在执行完成后最终将其停止。

1.依赖关系 –在pom.xml中添加以下依赖关系

<dependency><groupId>org.apache.camel</groupId><artifactId>camel-core</artifactId><version>${camel-version}</version></dependency><dependency><groupId>org.apache.camel</groupId><artifactId>camel-spring</artifactId><version>${camel-version}</version></dependency><dependency><groupId>org.apache.camel</groupId><artifactId>camel-aws</artifactId><version>${camel-version}</version></dependency>

2.创建RouterBuilder –可以通过扩展org.apache.camel.builder.RouterBuilder类并覆盖configure()方法来创建RouterBuilder。 这是一个例子

import org.apache.camel.builder.RouteBuilder;/*** Created by IntelliJ IDEA.* User: Niraj Singh* Date: 7/28/13* Time: 10:29 AM* To change this template use File | Settings | File Templates.*/
public class MyFirstRouterBuilder extends RouteBuilder {@Overridepublic void configure() throws Exception {try{from( "file:d:/vids").to("file:d:/temp");}catch(Exception e){}}
}
  1. From()是源端点,包含骆驼将要轮询的文件或目录的uri。
  2. to()代表目标端点,并包含目标文件或目录的名称。
  3. 文件组件uri的格式为“ file:// nameOfFileOrDirectory ”。

3.在Spring注册CamelContext并在Spring注入RouterBuilder。

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"><camelContext id="sqsContext" xmlns="http://camel.apache.org/schema/spring"><routeBuilder ref="myFirstRouter" /></camelContext><bean id="myFirstRouter" class="com.aranin.aws.sqs.MyFirstRouterBuilder"/></beans>

4.启动骆驼上下文并执行代码,然后停止骆驼上下文。

import org.apache.camel.CamelContext;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;/*** Created by IntelliJ IDEA.* User: Niraj Singh* Date: 4/16/13* Time: 11:21 AM* To change this template use File | Settings | File Templates.*/
public class CamelHello {public static void main(String args[]) throws Exception {try {ApplicationContext springcontext = new FileSystemXmlApplicationContext("D:/samayik/awsdemo/src/main/resources/hellocamel.xml");CamelContext context = springcontext.getBean("firstCamelContext", CamelContext.class);context.start();Thread.sleep(10000);context.stop();} catch ( Exception e ) {System.out.println(e);}}
}

如果运行此类,则首先我们从spring config文件中加载camelcontext。 在其中注入路由器生成器。 上下文启动后,然后将源目录中的所有文件复制到目标目录。 复制完所有文件后,尝试将新文件复制到源目录,在这种情况下,上下文运行10000 ms之前,该文件也将复制到目标文件。

我没有更多关于骆驼的高级教程。 也许您会发现它们很有用。 参考部分列出了这些链接。

参考文献

  1. http://camel.apache.org/
  2. http://camel.apache.org/enterprise-integration-patterns.html
  3. http://architects.dzone.com/articles/enterprise-integration
  4. http://weblog4j.com/2013/05/14/amazon-sqs-listening-to-sqs-using-apache-camel-the-spring-dsl-way/
  5. http://weblog4j.com/2013/04/17/amazon-sqs-listening-to-amazon-sqs-queue-using-apache-came l /

就这些了。 尽管没有人会发表评论,但是我还是要坚持不懈,如果您喜欢本教程,仍然请大家排一两行。

温暖的问候

尼拉吉

参考: Weblog4j博客上的JCG合作伙伴 Niraj Singh 对Apache Camel的介绍 。

翻译自: https://www.javacodegeeks.com/2013/08/introduction-to-apache-camel.html

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

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

相关文章

qt结构体嵌套结构体方法_9.2 C++结构体类型变量

C定义结构体类型变量的方法 1、先声明结构体类型再定义变量名&#xff0c;在定义了结构体变量后&#xff0c;系统会为之分配内存单元。struct Student{ //自定义结构体变量int num;//学号char sex;//性别int age;//年龄};2、在声明类型的同时定义变量 一般形式为struct 结构体名…

Vue解析--如何应对面试官提问

近期不断面试中&#xff0c;面试官都会提一些关于Vue相关的源码和“全家桶”之类的问题。那么针对这些提问&#xff0c;我们应该如何更好应答呢&#xff1f;在这里我把对Vue的理解整理出来供大家来参考。 1.Vue是什么&#xff1f; Vue是一套构建用户界面的渐进式框架&#xf…

Java开发人员的Erlang

您可能没有注意到&#xff0c;但是距离我上次发布博客已经过去了几个星期。 原因是我的Soleus骨折了&#xff0c;而我的腿也石膏了。 不能动弹&#xff0c;我认为调查完全不同的东西是个好主意–要么看那天的电视&#xff0c;要么&#xff0c;尽管Kojak和Magnum PI的重播很诱人…

20165339第六周学习总结

课本知识点总结 第八章 String类 使用String类声明对象并创建对象 String s new String("We are students"); String t new String("We are students"); String (char a[])用一个字符数组a创建一个String对象 char a[] {J,a,v,a}; String s new String(a)…

keil5用jlink不到芯片_洛达芯片检测

安卓手机下载一个络达官方的刷机软件然后连接上耳机&#xff0c;打开软件&#xff0c;就可以看到耳机芯片的相关信息。软件下载地址&#xff1a;https://pan.baidu.com/s/1MOXjkHv1wfxWWIVdcsMSFg 提取码: tasc我们的耳机都是络达芯片&#xff0c;不怕你检测&#xff0c;希望用…

层次和约束:项目中使用vuex的3条优化方案

问题描述 使用vuex的store的过程中&#xff0c;发现了一些不是很优雅的地方&#xff1a; store层module太多&#xff0c;找state、getter、mutation、action对应的module比较慢。 组件里面mapGetters、mapActions、mapMutations过多&#xff0c;分不清getter、action、mutati…

怎么让员工服从管理_为什么现在的员工执行力和服从性越来越差,管理一严格就辞职?...

当有负面情绪的时候&#xff0c;不要说。管好自己的嘴&#xff0c;有时候做哑巴&#xff0c;是一种境界。现在的企业很多都存在这个问题&#xff0c;员工执行力越来越差&#xff0c;服从性也越来越差&#xff0c;管理者稍微一严格&#xff0c;员工就会辞职走人&#xff0c;留不…

Spring Data REST的实际应用

什么是春天数据休息&#xff1f; spring-data-rest是spring-data项目的新增功能&#xff0c;它是一个框架&#xff0c;可帮助您将实体直接作为RESTful Web服务端点公开。 与rails&#xff0c;grails或roo不同&#xff0c;它不会生成任何实现此目标的代码。 spring data-rest支持…

2018上半年掘金微信群日报优质文章合集:前端篇

在掘金微信交流群里的小伙伴们&#xff0c;你们每天都还在坚持读小报吗&#xff1f;如果你的回答是yes&#xff0c;那真的要给你点一万个赞了?能坚持这么久&#xff0c;真的很优秀噢&#xff01;&#xff08;嗯&#xff0c;每天坚持给大家收集文章的小饼也很优秀?&#xff09…

linux运维笔试题目,linux运维相关的笔试题目_笔试题目

一、Linux系统和shell1、写一个sed命令&#xff0c;修改/tmp/input.txt文件的内容&#xff0c;要求&#xff1a;①删除所有空行&#xff1b;②在非空行前面加一个“AAA”&#xff0c;在行尾加一个“BBB”&#xff0c;即将内容为“11111”的一行改为&#xff1a;“AAA11111BBB”…

python之路--day17-shelve,xml和re模块

shelve模块 shelve模块只有一个open函数&#xff0c;返回类似字典的对象&#xff0c;可读可写&#xff0c;key必须为字符串&#xff0c;而值可以是python所支持的数据类型 1 import shelve2 # info1{age:18,height:180,weight:80}3 # info2{age:73,height:150,weight:80}4 #5 #…

20172314 2018-2019-1《程序设计与数据结构》第一周学习总结

教材学习内容总结 概述 软件工程&#xff1a;是一门关于高质量软件开发的技术和理论的学科&#xff0c;用来控制开发过程&#xff0c;实现高质量的软件。软件工程的目标&#xff1a;正确性、可靠性、健壮性、可用性、可维护性、可重用性、可移植性、运行效率。 对于可靠性和健壮…

activiti api文档_【白银人机】Activiti 工作流从入门到入土:完整 hello world 大比拼(API 结合实例讲解)...

点击上方“好好学java”&#xff0c;选择“置顶”公众号重磅资源、干货&#xff0c;第一时间送达重磅推荐 ① 纯福利 | 公众号资源大汇总&#xff0c;一年才一次&#xff01;② 重磅&#xff01;&#xff01;2018年Java全套入门到进阶学习视频及项目实战③ 2018年java架构师学习…

前端解读控制反转(IOC)

前言 随着前端承担的职责越来越重&#xff0c;前端应用向着复杂化、规模化的方向发展。大型项目模块化是一种趋势&#xff0c;不可避免模块之间要相互依赖&#xff0c;此外还有很多第三方包。这样的话如何去管理这些繁杂的文件&#xff0c;是一个不可避免的话题。此时作为一种…

ASP.NET MVC传递参数(model), 如何保持TempData的持久性

一看到此标题&#xff0c;相信你也会。因为路由是可以从URL地址栏传过去的。但是Insus.NET不想在地址栏传递&#xff0c;还是一个条件是jQuery的Ajax进行POST的。Insus.NET不清楚别人是怎样处理的&#xff0c;但是这个让Insus.NET花上不少时间来解决。Insus.NET实现的方法也很简…

深度学习语音降噪方法对比_人工智能-关于深度学习的基础方法

深度学习概述深度学习的一些简介&#xff0c;其要点如下&#xff1a;深度学习实际上是基于具有多个隐藏层的神经网络的学习&#xff1b;深度学习的思想来源于人类处理视觉信息的方式&#xff1b;深度学习的发展得益于数据的井喷和计算力的飙升&#xff1b;深度学习的理论基础依…

通过adb巧用monkey获取android设备中所有应用的主activity

由于工作需要&#xff0c;想获取所有应用的activity(这里仅限应用的主入口Launcher activity)&#xff0c;搜索了一下&#xff0c;网上实现的方案都是基于android编程实现的&#xff0c;对于不懂开发的测试来说稍有难度&#xff0c;而且对于PC端测试工具来说可行性略差。 给大家…

PWA · 前后端协作 · Node | JTalk 掘金线下活动第七期

通知 余票仅剩 3张&#xff0c;欢迎加入活动群获取更多通知。北京的小伙伴可以关注我们的 JTalk 第八期&#xff1a;前端安全 | 美团点评技术团队专场 ? 报名 扫码报名&#xff1a; 报名链接&#xff1a;点我报名 ? 介绍 本期 JTalk 来杭州啦&#xff01; 掘金线下活动 J…

指数函数中x的取值范围_基本初等函数I: 指数函数、对数函数和幂函数

本文大约4800字, 建议学习时间1个小时.在学习过一次函数和二次函数(修改版)后, 我们知道, 一次函数ykxb当一次项系数k大于零时是增函数, 小于零时是减函数. 二次函数yax2bxc当二次项系数a大于零时图象沿x轴从左向右先减后增, a小于零时先增后减. 可以想象, 次数更高的函数, 在定…

Linux系统之TroubleShooting(启动故障排除)

尽管Linux系统非常强大&#xff0c;稳定&#xff0c;但是我们在使用过程当中&#xff0c;如果人为操作不当&#xff0c;仍然会影响系统&#xff0c;甚至可能使得系统无法开机&#xff0c;无法运行服务等等各种问题。那么这篇博文就总结一下一些常见的故障排除方法&#xff0c;但…