camel系列-消息(Message)和交换机(Exchange)
消息Message
Message,即消息,是系统在使用消息传递通道时用来相互通信的实体。消息的流动是单向的,从发送方到接收方,如图 1.5 所示。
图 1.5 消息Message
是将数据从一个系统发送到另一个系统的实体。
消息Message
具有正文Body
(消息载体Payload
)、头Header
和可选的附件Attachment
,如图 1.6所示。
图 1.6 消息可以包含头、附件和正文
消息Message
都有一个 ID,数据类型是字符串,即 java.lang.String 对象。消息创建者可以根据各自的协议不同,创建一个消息 ID 并且保证它的唯一性。Camel 并没有规定消息 ID 的格式,对于没有 ID 生成方案的协议,Camel 会使用自己的 ID 生成器生成一个 ID。
消息头和附件
Header,即消息头Header
,是与消息Message
的参数,消息头可以包含发送方 ID、内容编码、身份验证信息等等。消息头是键值对存储,它的键是一个唯一的、不区分大小写的字符串,它的值是一个对象,即“java.lang.Object”。也就是说 Camel 对消息头的类型没有任何约束,对于消息头的大小或消息头的数量也没有任何限制,消息头在消息中,是一个 Map<String,Object>。消息Message
还可以附带附件,这些附件通常用于 web 服务和电子邮件组件。
消息体
Body,即消息体,类型为“java.lang.Object”,因此消息可以存储任何内容、任何大小,应用设计人员要确保接收者能够解析消息内容。当发送方和接收方使用不同的主体格式时,Camel 提供了将数据转换为可接受格式的机制,这种格式转换在幕后通过类型转换器自动进行。第 3 章全面介绍类型转换。
错误标志
消息还包含错误标志,在某些协议和规范下,如 SOAP Web 服务,错误标识区分了输出和错误消息。它们都是调用操作的有效响应,但后者表示不成功的结果。通常,在集成框架内不会处理这些错误。它是服务接口提供者和调用者之间契约的一部分,应当在各自应用中进行处理。
在路由过程中,消息Message
包含在交换Exchange
中。
交换 Exchange
Camel 中的交换Exchange
是消息在路由期间的容器,交换还定义了系统之间的交互模式,也称为 message exchange patterns (MEP),MEP 用于区分单向消息传递和请求-响应消息传递,Camel 的数据交换拥有一个 MEP 属性,它可以是以下任意一种:
_“InOnly”—单向消息(也称为事件消息)。例如,JMS 消息传递通常是单向消息传递。
_“InOut”—请求-响应消息。例如,基于 http 的传输通常是请求-应答:客户端提交 web 请求,等待服务器的应答。
图 1.7 说明了 Camel 中 Exchange 的内容。
图 1.7 Camel 的交换Exchange
具有 ID、MEP、Exceptions 和 Properties。它还具有一个 In 消息来存储传入消息,以及一个 Out 消息来存储应答。
让我们更详细地看看图 1.7 中的元素:
- Exchange ID - 交换的唯一 ID。Camel 自动生成唯一 ID。
- MEP - MEP 模式,表示你是使用“InOnly”还是“InOut”进行消息传递。当模式为“InOnly”时,交换只包含 in 消息。对于“InOut”,交换还包含 out 消息,即返回给调用者的应答消息。
- Exception - 如果在路由过程中任何时候发生异常,将在 Exception 字段中设置一个异常。
- Properties - 即属性,类似于消息头,但它们在整个路由数据交换期间都有效。属性用于包含全局级别的信息,而消息头是消息特有的。Camel 本身在路由过程中也会向交换中添加各种树形。作为开发人员,你可以在路由数据交换期间的任何时候存取这些属性。
- In message - 输入消息,一次交换必定有 in 消息,in 消息包含请求消息。
- Out message - 可选,只有当 MEP 是’InOut’时才存在。out 消息即回复消息。
同一个数据路由从数据开始传递到数据传递结束的整个生命周期里,交换对象保持不变,消息对象则可能随着路由路线的行进而改变,例如,在把消息从一种格式转换为另一种格式的时候。