最新消息:

[置顶] 架构设计:系统间通信(37)——Apache Camel快速入门(中)

php 浏览 评论

来源:程序员人生   发布时间:2016-07-29 15:36:55 阅读次数:1119次

==========================
(接上文《架构设计:系统间通讯(36)——Apache Camel快速入门(上)》)

(补上文:Endpoint重要的漏讲内容)

3⑴⑵、特殊的Endpoint Direct

Endpoint Direct用于在两个编排好的路由间实现Exchange消息的连接,上1个路由中由最后1个元素处理完的Exchange对象,将被发送至由Direct连接的下1个路由起始位置()。注意,两个被连接的路由1定要是可用的,并且存在于同1个Camel服务中。以下的例子说明了Endpoint Direct的简单使用方式。

package com.yinwenjie.test.cameltest.helloworld; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.impl.DefaultCamelContext; import org.apache.camel.model.ModelCamelContext; /** * 测试两个路由的连接 * @author yinwenjie */ { (String[] args) throws Exception { // 这是camel上下文对象,全部路由的驱动全靠它了。 ModelCamelContext camelContext = new DefaultCamelContext(); // 启动route camelContext.start(); // 首先将两个完全有效的路由注册到Camel服务中 camelContext.addRoutes((new DirectCamel()).new DirectRouteA()); camelContext.addRoutes((new DirectCamel()).new DirectRouteB()); // 通用没有具体业务意义的代码,只是为了保证主线程不退出 synchronized (DirectCamel.class) { DirectCamel.class.wait(); } } /** * DirectRouteA 其中使用direct 连接到 DirectRouteB * @author yinwenjie */ { /* (non-Javadoc) * @see org.apache.camel.builder.RouteBuilder#configure() */ () throws Exception { from("jetty::8282/directCamel") // 连接路由:DirectRouteB .to("direct:directRouteB") .to("log:DirectRouteA?showExchangeId=true"); } } /** * @author yinwenjie */ { /* (non-Javadoc) * @see org.apache.camel.builder.RouteBuilder#configure() */ () throws Exception { from("direct:directRouteB") .to("log:DirectRouteB?showExchangeId=true"); } } }

以上代码片断中,我们编排了两个可用的路由(虽然两个路由都很简单,但确切是两个独立的路由)命名为DirectRouteA和DirectRouteB。其中DirectRouteA实例在最后1个Endpoint控制端点(direct:directRouteB)中使用Endpoint Direct将Exchange消息发送到DirectRouteB实例的开始位置。以下是控制台输出的内容:

[, Body: [Body is instance of org]] (MarkerIgnoringBase.java:96) [, Body: [Body is instance of org]] (MarkerIgnoringBase.java:96)

从以上履行效果我们可以看到,被连接的两个路由使用的Exchange对象是同1个,也就是说在DirectRouteB路由中如果Exchange对象中的内容产生了变化就会在随后继续履行的DirectRouteA路由中产生影响。Endpoint Direct元素在我们实际使用Camel进行路由编排时,利用频度非常高。由于它可以把多个已编排好的路由依照业务要求连接起来,构成1个新的路由,保持原有路由的良好重用。

========================================(增补完)

3⑶、Processor 处理器

Camel中另外一个重要的元素是Processor处理器,它用于接收从控制端点、路由选择条件又或另外一个处理器的Exchange中传来的消息信息,并进行处理。Camel核心包和各个Plugin组件都提供了很多Processor的实现,开发人员也能够通过实现org.apache.camel.Processor接口自定义处理器(后者是通常做法)。

既然是做编码,那末我们自然可以在自定义的Processor处理器中做很多事情。这些事情可能包括处理业务逻辑、建立数据库连接去做业务数据存储、建立和某个第3方业务系统的RPC连接,但是我们1般不会那样做——那是Endpoint的工作。Processor处理器中最主要的工作是进行业务数据格式的转换和中间数据的临时存储。这样做是由于Processor处理器是Camel编排的路由中,主要进行Exchange输入输出消息交换的地方。

不过开发人员固然可以在Processor处理器中连接数据库。例如开发人员需要根据上1个Endpoint中携带的“定单编号前缀”信息,在Processor处理器中连接到1个独立的数据库中(或缓存服务中)查找其对应的路由信息,以便动态决定下1个路由路径。由于Camel支持和JAVA语言的Spring框架无缝集成,所以要在Processor处理器中操作数据库只需要进行非常简单的配置。

以下代码片断是自定义的Processor处理器实现,其中的process(Exchange exchange)方法是必须进行实现的:

{ ...... (Exchange exchange) throws Exception { Message message = exchange.getIn(); String body = message.getBody().toString(); (exchange.getPattern() == ExchangePattern.InOut) { Message outMessage = exchange.getOut(); outMessage.setBody(body + " || other out"); } } ...... }

注意,处理器Processor是和控制端点平级的概念。要看1个URI对应的实现是不是是1个控制端点,最根本的就是看这个实现类是不是实现了org.apache.camel.Endpoint接口;而要看1个路由中的元素是不是是Processor处理器,最根本的就是看这个类是不是实现了org.apache.camel.Processor接口。

3⑸、Routing路由条件

在控制端点和处理器之间、处理器和处理器之间,Camel允许开发人员进行路由条件设置。例如开发人员可以具有当Exchange In Message的内容为A的情况下将消息送入下1个处理器A,当Exchange In Message的内容为B时将消息送入下1个处理器B的处理能力。又例如,不管编排的路由中上1个元素的处理消息如何,都将携带消息的Exchange对象复制 多份,分别送入下1处理器X、Y、Z。开发人员乃至还可以通过路由规则完成Exchange到多个Endpoint的负载传输。

Camel中支持的路由规则非常丰富,包括:Message Filter、Based Router、Dynamic Router、Splitter、Aggregator、Resequencer等等。在Camel的官方文档中使用了非常形象化的图形来表示这些路由功能():

这里写图片描述

hg0088:[置顶] 架构设计:系统间通信(37)——Apache Camel快速入门(中)

发表我的评论
取消评论

表情

您的回复是我们的动力!

  • 昵称 (必填)
  • 验证码 点击我更换图片

网友最新评论