设为首页 收藏本站
查看: 1525|回复: 0

[经验分享] Apache Camel系列(1)----使用场景

[复制链接]

尚未签到

发表于 2017-3-1 08:20:19 | 显示全部楼层 |阅读模式
Apache Camel是一个基于Enterprise Integration Pattern(企业整合模式,简称EIP)的开源框架。EIP定义了一些不同应用系统之间的消息传输模型,包括常见的Point-to-Point,Pub/Sub模型。更多关于EIP的信息,可以参见这里



Apache Camel主要提供了以下功能:

1,实现了EIP的大部分模式,如果你要在不同的应用系统之间以不同的方式传递消息,那么你可以从Apache Camel中找到解决反感。

2,提供了大量Component(组件),每个组件都是一种消息中间件(或消息服务)的具体实现,每个消息中间件所用的协议都是不同的,因此,你可以通过多种不同的协议来完成消息传输。

3,允许用户定义灵活的路由规则,从这个角度来说,Apache Camel时一个规则引擎。



那么Apache Camel的应用场景有那些呢,这里列举一些:



1,消息汇聚,比如你有来自不同服务器的消息,有ActiveMQ,RabbitMQ,WebService等,你想把它们都存储到日志文件中,那么可以定义如下规则。






1 new RouteBuilder() {
2     @Override
3     public void configure() throws Exception {
4         from("amqp:queue:incoming").to("log:com.mycompany.log?level=DEBUG");
5         from("rabbitmq://localhost/A/routingKey=B").to("log:com.mycompany.log?level=DEBUG");
6         from("jetty:http://localhost:8080/myapp/myservice").to("log:com.mycompany.log?level=DEBUG");
7     }
8 }
  from表示从这个endpoing取消息,to表示将消息发往这个endpoint,endpoint是消息地址,包含协议类型以及url。




2,消息分发,分为两种,顺序分发和并行分发。顺序分发时,消息会先到到第一个endpoing,第一个endpoint处理完成后,再分发到下下个endpoint。如果第一个endpoing处理出现故障,那么消息不会被传到第二个endpoint。比如有如下规则:

from("amqp:queue:order").to("uri:validateBean", "uri:handleBean", "uri:emailBean");

这个规则是从order队列中取订单信息,然后依次验证订单,处理订单,并发送邮件通知用户。任何一个步骤出错,下一个步骤将不回执行。



并行分发是将得到的消息同时发送到不同的endpoint,没有先后顺序之分,各个endpoint处理消息也是独立的。如果将以上路由改成

from("amqp:queue:order").multicast().to("uri:validateBean", "uri:handleBean", "uri:emailBean");

那么消息就会同时发到to所对应的endpoint。



3,消息转换,比如想将xml数据转换成json数据,可以使用如下规则。






from("amqp:queue:order").process(new XmlToJsonProcessor()).to("bean:orderHandler");

其中XmlToJsonProcessor是自定义的类,继承org.apache.camel.Processor,用于将xml数据转换成json。



4,规则引擎,你可以使用Spring Xml, Groovy这类DSL来定义route,这样无需修改代码,就能达到修改业务逻辑的目的。

例如上边的规则,from("amqp:queue:order").to("uri:validateBean", "uri:handleBean", "uri:emailBean");使用Spring Xml定义如下:






<route>
<from uri="amqp:queue:order"/>
<multicast>
<to uri="uri:validateBean"/>
<to uri="uri:handleBean"/>
<to uri="uri:emailBean"/>
</multicast>
</route>



如果需要在处理完订单后添加日志,可以改称如下规则






<route>
<from uri="amqp:queue:order"/>
<multicast>
<to uri="uri:validateBean"/>
<to uri="uri:handleBean"/>
<to uri="log:com.mycompany.log?level=INFO"/>
<to uri="uri:emailBean"/>
</multicast>
</route>


另外camel提供了大量的内置Processor,用于逻辑运算,过滤等,这样更加容易定移除灵活的route,例如:






from("amqp:queue:order").filter(header("foo").isEqualTo("bar")).choice()
.when(xpath("/person/city = &#39;London&#39;"))
.to("file:target/messages/uk")
.otherwise()
.to("file:target/messages/others");


这条规则先对订单进行过滤,只处理header中foo的值为bar的订单,然后根据用户的城市进行将订单传给不同的endpoint。





Apache Camel的应用场景有很多,这里只是大致列举了几种。如果还不是很理解Camel的应用场景,你可以先到Enterprise Integration Pattern(企业整合模式,简称EIP)中去找对应的scenario,点击每种scenario下的链接,就能找到Camel对应的实现。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-348542-1-1.html 上篇帖子: 使用intellij idea搭建MAVEN+springmvc+mybatis框架 下篇帖子: Running Dubbo On Spring Boot
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表