第 34 章 了解消息格式

摘要

在开始使用 Apache Camel 编程之前,您需要明确了解消息和消息交换如何建模。由于 Apache Camel 可以处理许多消息格式,因此基本消息类型设计为具有抽象格式。Apache Camel 提供了访问和转换数据格式所需的 API,这些格式是消息正文和消息标头下。

34.1. 交换

概述

exchange 对象 是封装接收的消息并存储其关联的元数据(包括 交换属性)的打包程序。另外,如果当前消息被分配给制作者端点,则交换会提供一个临时插槽来保存回复( Out 消息)。

Apache Camel 中交换的一个重要特点是它们支持创建消息的速度。如果不需要明确访问消息的路由,这可以提供显著的优化功能。

图 34.1. 通过路由交换对象传输

通过路由交换对象

图 34.1 “通过路由交换对象传输” 显示通过路由的交换对象。在路由上下文中,交换对象将作为 Processor.process() 方法的参数传递。这意味着,交换对象可以被源端点、目标端点和两者中的所有处理器直接访问。

Exchange 接口

org.apache.camel.Exchange 接口定义了用于访问 InOut 消息的方法,如 例 34.1 “Exchange method” 所示。

例 34.1. Exchange method

// 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 Interface”

延迟创建消息

Apache Camel 支持在、Out故障消息中创建 延迟。这意味着在您尝试访问它们之前不会创建消息实例(例如,调用 getIn()getOut())。lazy 消息创建语义由 org.apache.camel.impl.DefaultExchange 类实施。

如果您调用一个 no-argument accessors(getIn()getOut()),或者调用等于 true 的 accessor(即 getIn(true)getOut(true)),则默认方法实施会创建一个新的消息实例(如果其中一个实例尚不存在)。

如果您调用了布尔值参数的 accessor 等于 false (即 getIn(false)getOut(false)),则默认方法实施会返回当前消息值。[1]

延迟创建交换 ID

Apache Camel 支持创建交换 ID。您可以在任何交换上调用 getExchangeId(),以获取该交换实例的唯一 ID,但只有您真正调用这个方法时才会生成 ID。这个方法的 DefaultExchange.getExchangeId() 实现将 ID 生成委托给使用 CamelContext 注册的 UUID 生成器。

有关如何使用 CamelContext 注册 UUID 生成器的详情,请参考 第 34.4 节 “built-In UUID Generators”



[1] 如果没有活动方法,返回的值将为 null