Apache Camel指南-第二章:路由径构建之管道处理

摘要

Apache Camel提供了多个处理器和组件,您可以在一条路线中将它们链接在一起。本章通过解释使用提供的构造块构造路线的原理来提供基本的指导。

管道处理

概览

在Apache Camel中,流水线化是连接路由定义中的节点的主要范例。管道概念对于UNIX操作系统的用户来说可能是最熟悉的,在该概念中,管道概念用于加入操作系统命令。例如,ls | more是将目录列表管道ls传输到页面滚动实用程序的命令示例more。流水线的基本思想是将一个命令的输出馈入下一个命令的输入。在路由情况下,自然的类比是将一个处理器的Out消息复制到下一处理器的In消息。

处理器节点

在路由中,除了初始端点之外,每个节点都是处理器,从它们从org.apache.camel.Processor接口继承的意义上来说。换句话说,处理器构成了DSL路由的基本组成部分。例如,DSL命令,例如filter()delayer()setBody()setHeader(),和to()所有代表处理器。在考虑处理器如何连接在一起以构建路由时,区分两种不同的处理方法非常重要。

第一种方法是处理器简单地修改交换机的In消息,在这种情况下,交换机的出栈消息仍然保留null

[处理器修改入站消息

以下路由显示了一个通过添加(或修改)标题setHeader()来修改当前In消息的命令BillingSystem

from("activemq:orderQueue")
    .setHeader("BillingSystem", xpath("/order/billingSystem"))
    .to("activemq:billingQueue");

第二种方法是处理器创建Out消息以表示处理结果

[处理器创建外出消息]

以下路由显示了一个transform()命令,该命令创建一个Out消息,消息主体包含字符串DummyBody

from("activemq:orderQueue")
    .transform(constant("DummyBody"))
    .to("activemq:billingQueue");

其中constant("DummyBody")表示一个常量表达式。您不能DummyBody直接传递字符串,因为to的参数transform()必须是表达式类型。

InOnly交换管道

下图显示了InOnly交换的处理器管道的示例。处理器A通过修改In消息来工作,而处理器B和C创建Out消息。路由生成器将处理器链接在一起,如图所示。特别是,处理器B和C以流水线的形式链接在一起:也就是说,在将交换输入处理器C之前,处理器B的Out消息被移至In消息,而处理器C的Out消息被移至In消息,然后再将交换输入到生产者端点。因此,处理器的输出和输入被连接到一个连续的管道中。

InOnly交换的样本管道

默认情况下,Apache Camel使用管道模式,因此您无需使用任何特殊语法即可在路由中创建管道。例如,以下路由从userdataQueue队列中提取消息,通过Velocity模板通过管道传送消息(以产生文本格式的客户地址),然后将结果文本地址发送到队列envelopeAddresses

from("activemq:userdataQueue")
    .to(ExchangePattern.InOut, "velocity:file:AdressTemplate.vm")
    .to("activemq:envelopeAddresses");

Velocity端点,在其中velocity:file:AddressTemplate.vm指定Velocity模板文件file:AddressTemplate.vm在文件系统中的位置。在to()将交换发送到Velocity端点之前,该命令将交换模式更改为InOut,然后将其更改回InOnly。有关Velocity端点的更多详细信息,请参阅《Apache Camel组件参考指南》中的Velocity

InOut交换管道

如图所示出了用于处理器流水线的一个例子的InOut交流,这通常使用,以支持远程过程调用(RPC)的语义。处理器A,B和C以流水线的形式链接在一起,每个处理器的输出被馈送到下一个处理器的输入中。生产者端点产生的最终Out消息将一直发送回消费者端点,在此它提供对原始请求的答复。

InOut交换的样本管道

请注意,为了支持InOut交换模式,必不可少的是,路由中的最后一个节点(无论是生产者端点还是其他某种处理器)创建一个Out消息。否则,任何连接到使用者端点的客户端都将挂起并无限期地等待答复消息。您应该意识到,并非所有生产者端点都创建Out消息。

考虑以下通过处理传入的HTTP请求来处理付款请求的路由:

from("jetty:http://localhost:8080/foo")
    .to("cxf:bean:addAccountDetails")
    .to("cxf:bean:getCreditRating")
    .to("cxf:bean:processTransaction");

当收款请求,使之通过Web服务,流水线处理cxf:bean:addAccountDetailscxf:bean:getCreditRatingcxf:bean:processTransaction。最终的Web服务processTransaction生成响应(Out消息),该响应通过JETTY端点发送回。

当管道仅由一系列端点组成时,也可以使用以下替代语法:

from("jetty:http://localhost:8080/foo")
    .pipeline("cxf:bean:addAccountDetails", "cxf:bean:getCreditRating", "cxf:bean:processTransaction");

InOptionalOut交换管道

对于管道InOptionalOut交往本质上是一样的管道在InOutInOptionalOut之间的区别在于,允许使用InOptionalOut交换模式进行的交换具有空的Out消息作为答复。即,在InOptionalOut交换的情况下,将nullOut消息复制到管道中下一个节点的In消息中。相反,在InOut交换的情况下,将丢弃nullOut消息,而原始In来自当前节点的消息将被复制到下一个节点的In消息中。
InOut Exchanges

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沙子可可

你的鼓励是我创造的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值