第 11 章 消息传递端点

摘要

消息传递端点模式描述了可以在端点上配置的各种功能和服务质量。

11.1. 消息传递映射程序

概述

消息传递映射器 模式描述了如何将域对象映射到规范消息格式,其中消息格式被选为可中立的平台。选择的消息格式应适用于通过 第 6.5 节 “消息总线” 进行传输,其中消息总线是集成各种不同系统的后端,其中有些可能不是面向对象。

可能有很多不同的方法,但并非所有方法都满足消息传递映射程序的要求。例如,传输对象的一个明显方法是使用 对象序列化,它允许您使用非模糊编码(在 Java 中支持原生支持的)将对象写入数据流。但是,这不是 用于 messaging 映射器模式的适当方法,因为序列化格式只被 Java 应用程序理解。Java 对象序列化会在原始应用程序和消息传递系统中的其他应用程序间造成不匹配的情况。

消息传递映射程序的要求总结如下:

  • 用于传输域对象的规范消息格式应适用于非面向对象的应用程序使用。
  • 映射程序代码应该独立于域对象代码和消息传递基础架构实现。Apache Camel 通过提供 hook 来实现此要求,可用于将映射程序代码插入到路由中。
  • 映射器可能需要找到处理某些面向对象的概念(如继承、对象引用和对象树)的有效方法。这些问题的复杂性因应用程序而异,但映射程序实施必须始终能够创建能由非面向对象的应用程序有效地处理的消息。

查找要映射的对象

您可以使用以下机制之一查找要映射的对象:

  • 找到注册的 bean. baseDomain for singleton 对象和少量对象,您可以使用 CamelContext 注册表存储对 Bean 的引用。例如,如果一个 bean 实例使用 Spring XML 进行实例化,它将自动输入到 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 表达式中替换标头值。

  • 动态 admission-对更具扩展性的解决方案,可能需要从数据库读取对象数据。在某些情况下,现有面向对象的应用程序可能会已经提供一个 finder 对象,可以从数据库加载对象。在其他情况下,您可能必须编写一些自定义代码以从数据库提取对象,在这种情况下,JDBC 组件和 SQL 组件可能会很有用。