第 11 章 消息传递端点
摘要
消息传递端点模式描述了可以在端点上配置的各种功能和服务质量。
11.1. 消息传递映射程序
概述
消息传递映射器 模式描述了如何将域对象映射到规范消息格式,其中消息格式被选为可能的平台中立。所选消息格式应该适合通过 第 6.5 节 “消息总线” 进行传输,其中消息总线是集成各种不同系统的后端,其中一部分可能不是面向对象的。
许多不同的方法都有可能,但并非所有方法都满足消息传递映射程序的要求。例如,传输对象的一种明显方法是使用 对象序列化,它允许您使用不模糊的编码(在 Java 中原生支持)将对象写入数据流。但是,这不是 用于消息传递映射器模式的适当方法,因为序列化格式只被 Java 应用程序理解。Java 对象序列化在原始应用程序和其他消息传递系统中应用程序之间产生异常不匹配。
消息传递映射程序的要求总结如下:
- 用于传输域对象的规范消息格式应该适合由非面向对象的应用程序使用。
- 映射器代码应独立于域对象代码和消息传递基础架构单独实施。Apache Camel 通过提供可用于将映射程序代码插入路由中的 hook 来帮助满足此要求。
- 映射器可能需要查找处理某些面向对象的概念的有效方法,如继承、对象引用和对象树。这些问题的复杂性因应用程序而异,但映射器实施的目标是创建由非面向对象的应用程序有效处理的消息。
查找要映射的对象
您可以使用以下机制之一来查找要映射的对象:
-
查找注册的 bean. criu-criu 用于单例对象和少量对象,您可以使用
CamelContext
registry 存储对 Bean 的引用。例如,如果使用 Spring XML 实例化 bean 实例,它会自动输入到 registry 中,其中 bean 由其id
属性的值标识。 使用 JoSQL 语言选择对象。 如果您想访问的所有对象都在运行时已实例化,您可以使用 JoSQL 语言来定位特定的对象(或对象)。例如,如果您有一个类
org.apache.camel.builder.sql.Person
,且名称
bean 属性具有UserName
标头,则可以选择其name
属性等于以下代码的UserName
标头对象:import static org.apache.camel.builder.sql.SqlBuilder.sql; import org.apache.camel.Expression; ... Expression expression = sql("SELECT * FROM org.apache.camel.builder.sql.Person where name = :UserName"); Object value = expression.evaluate(exchange);
其中,
使用语法
:HeaderName 来替换 JoSQL 表达式中的标头值。- 对于更 可扩展的解决方案,可能需要从数据库读取对象数据。在某些情况下,现有面向对象的应用可能已提供一个 finder 对象,可以从数据库加载对象。在其他情况下,您可能需要编写一些自定义代码以从数据库中提取对象,在这种情况下,JDBC 组件和 SQL 组件可能很有用。