第 34 章 了解消息格式
摘要
在使用 Apache Camel 开始编程之前,您应该明确了解消息和消息交换的建模方式。由于 Apache Camel 可以处理许多消息格式,因此基本消息类型旨在具有抽象格式。Apache Camel 提供了访问和转换消息正文和消息标头下的数据格式所需的 API。
34.1. Exchanges
概述
Exchange 对象 是一种封装收到的消息并存储其关联的元数据(包括 交换属性)的打包程序。另外,如果当前消息被分配给生成者端点,则交换提供一个临时插槽来保存回复( Out 信息)。
Apache Camel 中交换的一个重要特性是它们支持即时创建消息。当路由不需要显式访问消息时,这可能会造成显著的优化。
图 34.1. 通过路由交换对象
图 34.1 “通过路由交换对象” 显示通过路由传递的 Exchange 对象。在路由上下文中,交换对象作为 Processor.process ()
方法的参数传递。这意味着,源端点、目标端点和之间的所有处理器都可以直接访问交换对象。
Exchange 接口
org.apache.camel.Exchange 接口定义了访问 In 和 Out 信息的方法,如 例 34.1 “Exchange 方法” 所示。
例 34.1. Exchange 方法
// Access the In message Message getIn(); void setIn(Message in); // Access the Out message (if any) Message getOut(); void setOut(Message out); boolean hasOut(); // Access the exchange ID String getExchangeId(); void setExchangeId(String id);
有关 Exchange 界面中方法的完整描述,请参阅 第 43.1 节 “Exchange 接口”。
lazy 创建信息
Apache Camel 支持 lazy 创建 In、Out 和 Fault 消息。这意味着,在尝试访问消息实例之前,不会创建消息实例(例如,通过调用 getIn ()
或 getOut ()
)。lazy 消息创建语义由 org.apache.camel.impl.DefaultExchange
类实现。
如果您调用一个 no-argument accessors (getIn ()
或 getOut ()
),或者如果调用一个布尔值参数等于 true
(即 getIn (true)
或 getOut (true)
),则默认方法实现会创建一个新的消息实例。
如果您调用一个布尔值参数等于 false (即 getIn (
或 false
)getOut (false)
)的访问者,则默认方法实施会返回当前的消息值。[1]
延迟创建交换 ID
Apache Camel 支持 lazy 创建交换 ID。您可以在任何交换上调用 getExchangeId ()
来获取该交换实例的唯一 ID,但 ID 仅在实际调用方法时生成。此方法的 DefaultExchange.getExchangeId ()
实现将 ID 生成委托给通过 CamelContext
注册的 UUID 生成器。
有关如何使用 CamelContext
注册 UUID 生成器的详情,请参考 第 34.4 节 “built-In UUID Generators”。