1.3 Camel的消息模型

Posted by Laurence on Wednesday, May 7, 2025

Camel 使用两种抽象来建模消息,我们将在本节中介绍:

  • org.apache.camel.Message:Camel 中承载和路由数据的基本实体。

  • org.apache.camel.Exchange:Camel 中用于消息交换的抽象。这种消息交换包含一个输入消息(in message),以及作为回复的输出消息(out message)。

我们将首先介绍消息,以便你了解 Camel 中数据建模和承载的方式。然后我们将展示 Camel 如何通过交换(exchange)来建模"对话"。

消息

消息是系统在使用消息通道进行通信时使用的实体。消息从发送者单向流向接收者,如图 1.5 所示。 消息是用于从一个系统向另一个系统发送数据的实体 图1.5 消息是用于从一个系统向另一个系统发送数据的实体。

消息包含主体(负载)、头部以及可选的附件,如图 1.6 所示。

Message structure

消息通过类型为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 中交换的内容。

Exchange 图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 及其架构的内容做好了充分准备。