Camel 使用两种抽象来建模消息,我们将在本节中介绍:
-
org.apache.camel.Message:Camel 中承载和路由数据的基本实体。
-
org.apache.camel.Exchange:Camel 中用于消息交换的抽象。这种消息交换包含一个输入消息(in message),以及作为回复的输出消息(out message)。
我们将首先介绍消息,以便你了解 Camel 中数据建模和承载的方式。然后我们将展示 Camel 如何通过交换(exchange)来建模"对话"。
消息
消息是系统在使用消息通道进行通信时使用的实体。消息从发送者单向流向接收者,如图 1.5 所示。
图1.5 消息是用于从一个系统向另一个系统发送数据的实体。
消息包含主体(负载)、头部以及可选的附件,如图 1.6 所示。
消息通过类型为java.lang.String
的标识符进行唯一标识。标识符的唯一性由消息创建者强制保证,依赖于具体协议,且没有统一的格式要求。对于未定义唯一消息标识方案的协议,Camel 使用其自身的 ID 生成器。
消息头和附件
头部是与消息相关的值,例如发送者标识、内容编码提示、认证信息等。头部是键值对形式;键是一个唯一的、不区分大小写的字符串,值是java.lang.Object
类型。Camel 对头部的类型没有任何限制。头部的大小或消息包含的头部数量也没有限制。头部存储在消息内的映射(map)中。消息还可以包含可选的附件,这些附件通常用于 Web 服务和电子邮件组件。
消息体
主体的类型是java.lang.Object
,因此消息可以存储任何类型的内容和任何大小。由应用程序设计者负责确保接收者能够理解消息的内容。当发送者和接收者使用不同的主体格式时,Camel 提供了将数据转换为可接受格式的机制,在这些情况下,类型转换器会在幕后自动完成转换。第 3 章将全面介绍消息转换。
故障标志
消息还包含一个故障标志。某些协议和规范(如 SOAP Web 服务)区分输出消息和故障消息。两者都是调用操作的有效响应,但后者表示结果不成功。通常,集成基础设施不会处理故障。故障是客户端与服务器之间契约的一部分,由应用程序层面处理。
在路由过程中,消息被包含在交换(exchange
)中。
交换
在 Camel 中,交换(exchange
)是消息在路由过程中使用的容器。交换还支持系统之间的各种交互类型,也称为消息交换模式(MEPs
)。MEPs
用于区分单向消息和请求-响应消息风格。Camel 交换持有一个模式属性,可以是以下之一:
-
InOnly:单向消息(也称为事件消息)。例如,JMS 消息通常是单向消息。
-
InOut:请求-响应消息。例如,基于 HTTP 的传输通常是请求-响应模式:客户端提交 Web 请求,等待服务器的回复。
图 1.7 展示了 Camel 中交换的内容。
图1.7 Camel 交换包含一个 ID、MEP(消息交换模式)、异常和属性。它还有一个输入消息(in message)用于存储传入消息,以及一个输出消息(out message)用于存储回复。
让我们更详细地看看图 1.7 中的元素:
-
Exchange ID
:一个唯一标识交换的 ID,Camel 会自动生成这个唯一 ID。 -
MEP
:表示使用的是InOnly
还是InOut
消息风格的模式。当模式为InOnly
时,交换包含一个输入消息(in message)。对于InOut
模式,还存在一个输出消息(out message),包含对调用者的回复消息。 -
异常(
Exception
):如果在路由过程中任何时候发生错误,异常字段中将设置一个 Exception。 -
属性(
Properties
):类似于消息头部,但它们在整个交换的生命周期内持续存在。属性用于存储全局级别的信息,而消息头部特定于某个特定消息。Camel本身在路由过程中会向交换添加各种属性。作为开发者,你可以在交换生命周期的任何时候存储和检索属性。 -
输入消息(
In message
):这是必填的输入消息,包含请求消息。 -
输出消息(
Out message
):这是可选消息,仅在 MEP 为InOut
时存在。输出消息包含回复消息。
在整个路由生命周期中,交换保持不变,但消息可能会发生变化,例如,当消息从一种格式转换为另一种格式时。
我们先讨论了 Camel 的消息模型,然后再介绍架构,因为我们希望你对 Camel 中的消息有扎实的理解。毕竟,Camel 最重要的功能是路由消息。现在你已经为学习更多关于 Camel 及其架构的内容做好了充分准备。