`
kimmking
  • 浏览: 552567 次
  • 性别: Icon_minigender_1
  • 来自: 中华大丈夫学院
社区版块
存档分类
最新评论

【翻译】Spring Integration参考手册-第二章

    博客分类:
  • esb
阅读更多

2010-8-27

kimmking@163.com

2.   消息结构

Spring Integration中的Message是一个通用的数据容器,可以提供任何对象作为负载(payload),任何Message也可以包含一些带有用户扩展属性键值对的头部。

 

2.1     消息接口

下面是Message的接口定义:

public interface Message<T> {

 

    T getPayload();

 

    MessageHeaders getHeaders();

 

}

 

很明显,Message是一个非常重要的API。通过一个通用的包装封装数据,消息系统可以传递它到各处,而无需知道数据的类型。为一个新应用解决了添加各种新类型,或者当类型可以修改或(和)扩展,消息系统将不会被这些更改影响。另一方面,当消息系统中的一些组件需要访问Message中的信息,一些元数据可以从Message头中存取。

 

2.2     消息头

正如Spring Integration允许任何对象作为Message的负载,它也支持任何对象类型作为消息头值。事实上,MessageHeaders类实现了java.util.Map接口:

public final class MessageHeaders implements Map<String, Object>, Serializable {
         ...
}

 

注意:

尽管MessageHeaders实现了Map,它却是一个只读的实现。任何试图put一个值到Map的操作都会抛出一个UnsupportedOperationException异常。removeclear操作也是一样的。因为Message可以被传递给多个消费者,所以Map的结构不能被修改。并且,Message负载对象在创建以后不能被setHowever, the mutability of the header values themselves (or the payload Object) is intentionally left as a decision for the framework user.

作为Map的一个实现,通过调用get方法,传递消息头的名称作为参数,即可以获取相应的消息头。另外,可以提供一个Class类型的第二个参数。更甚至于,对于获取预定义的值,可以使用非常方便的getter。如下是上面三种情形的示例:

Object someValue = message.getHeaders().get("someKey");
 
 CustomerId customerId = message.getHeaders().get("customerId", CustomerId.class);
 
 Long timestamp = message.getHeaders().getTimestamp();
 

如下是预定义的消息头:

Table 2.1. Pre-defined Message Headers

Header Name

Header Type

ID

java.util.UUID

TIMESTAMP

java.lang.Long

EXPIRATION_DATE

java.lang.Long

CORRELATION_ID

java.lang.Object

REPLY_CHANNEL

java.lang.Object (can be a String or MessageChannel)

ERROR_CHANNEL

java.lang.Object (can be a String or MessageChannel)

SEQUENCE_NUMBER

java.lang.Integer

SEQUENCE_SIZE

java.lang.Integer

PRIORITY

MessagePriority (an enum)

 

很多inboundoutboundadapter实现也提供或(和)期望适当的消息头,当然也可以配置额外的用户自定义消息头。

2.3     消息实现

Message接口的基本实现是GenericMessage<T>,他提供了两个构造器:

new GenericMessage<T>(T payload);
 
new GenericMessage<T>(T payload, Map<String, Object> headers)

创建一个Message时,会同时生成一个随即的唯一ID。构造器可以接受一个消息头的Map,然后复制其中的消息头到新创建的Message

还有两个方便的子类可用:StringMessageErrorMessage。前者接受一个String作为负载:

StringMessage message = new StringMessage("hello world");
 
String s = message.getPayload();

后者接受任何Throwable对象作为负载:

ErrorMessage message = new ErrorMessage(someThrowable);
 
Throwable t = message.getPayload();

注意到这些实现得益于GenericMessage类是参数化的。因此,正如上面的示例,从消息中获取负载对象不需要显示的转换类型。

 

2.4     MessageBuilderHelper

你可以注意到Message接口只定义了获取消息负载和消息头的方法,却没有setter。这是因为消息创建后就不能被修改。因此,当一个消息的实例发送给多个消费者(例如通过一个发布订阅通道),如果消费者之一需要使用不同的负载类型发送一个响应,它应该创建一个新的Message。所以,这些变动不会影响其他消费者。记住,多个消费者可以访问同样的消息负载实例和消息头,这样的一个实例是否不可修改取决于开发者。换句话说,Message的契约就像是一个不可修改的集合(unmodifiable Collection),而MessageHeadersmap进一步展示了这一点。虽然MessageHeaders类实现了java.util.Map,但是MessageHeaders上任何一个put(或是removeclear)操作的调用都会产生一个UnsupportedOperationException异常。

相对于需要创建并填充一个Map然后传递给GenericMessage的构造函数来创建消息,Spring Integration提供了一个更方便的方式:MessageBuilderMessageBuilder提供了两个工厂方法从一个已经存在的消息或是一个负载对象来构造消息实例。当从一个已经存在的消息构建时,

原有消息的负载和消息头都会被复制到新的消息:

Message<String> message1 = MessageBuilder.withPayload("test")
        .setHeader("foo", "bar")
        .build();
 
Message<String> message2 = MessageBuilder.fromMessage(message1).build();
 
assertEquals("test", message2.getPayload());
assertEquals("bar", message2.getHeaders().get("foo"));

如果需要使用一个新的负载来创建一个消息,但是仍然希望从已经存在的消息复制消息头,你可以使用MessageBuildercopy方法之一。

Message<String> message3 = MessageBuilder.withPayload("test3")
        .copyHeaders(message1.getHeaders())
        .build();
 
Message<String> message4 = MessageBuilder.withPayload("test4")
        .setHeader("foo", 123)
        .copyHeadersIfAbsent(message1.getHeaders())
        .build();
 
assertEquals("bar", message3.getHeaders().get("foo"));
assertEquals(123, message4.getHeaders().get("foo"));

注意copyHeadersIfAbsent不会覆盖现有的值。在上面的第二个例子中,你也可以看到如何使用setHeader设置用户自定义的消息头。最后,系统提供了一些方法来设置一些预定义的消息头,它们不会妨碍设置任何消息头(MessageHeaders类中也定义了这些预定义消息头名字的常量)。

Message<Integer> importantMessage = MessageBuilder.withPayload(99)
        .setPriority(MessagePriority.HIGHEST)
        .build();
 
assertEquals(MessagePriority.HIGHEST, importantMessage.getHeaders().getPriority());
 
Message<Integer> anotherMessage = MessageBuilder.fromMessage(importantMessage)
        .setHeaderIfAbsent(MessageHeaders.PRIORITY, MessagePriority.LOW)
        .build();
 
assertEquals(MessagePriority.HIGHEST, anotherMessage.getHeaders().getPriority());

MessagePrioity是仅仅在使用PrioityChannel时被考虑(将在下一章描述)。它被定义成一个包括5个可能的值的枚举量。

public enum MessagePriority {
    HIGHEST,
    HIGH,
    NORMAL,
    LOW,
    LOWEST
}
分享到:
评论
4 楼 pengshan 2015-07-14  
However, the mutability of the header values themselves (or the payload Object) is intentionally left as a decision for the framework user.

不过,消息头中的值(即负载表示的对象)本身是否只读,则由框架的使用者自行决定。(直译的话,就是:则是框架有意赋予使用者的选择权)
3 楼 luijia2006 2011-08-24  
顶一个
2 楼 lshoo 2011-07-03  
还有第三章吗
1 楼 java_code 2011-03-25  
好样的,支持楼主,期待第三章

相关推荐

    camel-manual-2.4.0, 用户手册

    为了快速开始使用 Apache Camel,本章提供了一些简单的示例供参考。对于希望更深入了解的读者来说,建议跳过这些快速入门示例,直接进入更深入的介绍部分。 #### 三、入门指南 - **安装和设置**:介绍如何安装 ...

    camel2.2.0 手册

    为了快速上手 Apache Camel,用户可以通过阅读手册第二章的简单示例开始。对于希望更深入学习的读者,建议跳过快速入门,直接进入后续章节,这些章节将涵盖更多关于架构、企业集成模式、食谱、教程以及语言和组件...

    基于SpringBoot的企业oa管理系统(源码+数据库+万字文档)300

    企业oa管理系统,系统包含两种角色:管理员、用户,主要功能如下。 管理员: 1. 个人中心:管理管理员个人信息和进行相关操作。 2. 用户管理:管理用户的基本信息和权限设置。 3. 公告信息管理:发布和管理企业内部公告信息。 4. 客户关系管理:管理客户信息、跟进记录和销售机会等。 5. 通讯录管理:管理企业内部员工通讯录信息。 6. 日程安排管理:管理个人和团队的日程安排和会议安排。 7. 车辆信息管理:管理企业车辆的基本信息和使用情况。 8. 文件信息管理:管理企业内部文件的上传、下载和共享。 9. 工作日志管理:记录和管理员工的工作日志和任务完成情况。 10. 上班考勤管理:管理员工的上班打卡和考勤记录。 11. 工资信息管理:管理员工的工资信息和薪资发放。 用户: 1. 个人中心:管理个人信息和进行相关操作。 2. 公告信息管理:查看和阅读企业内部公告信息。 3. 客户关系管理:查看和管理与自己相关的客户信息和销售机会。 4. 通讯录管理:查找和查看企业内部员工通讯录信息。 5. 日程安排管理:查看和管理个人的日程安排和会议安排。 6. 车辆信息管理:查看和申请企业车辆的使

    Autox-v7-arm64-v8a-release-v7.1.2.apk

    AutoX.js 是一个基于 JavaScript 的自动化工具,主要用于安卓设备的自动化操作。它是 Auto.js 的一个分支,提供了更多的功能和更高的兼容性。以下是关于 AutoX.js 的一些基本介绍和使用方法。

    TypeScript全面进阶指南

    1.开篇:用正确的方式学习 TypeScript 2.工欲善其事:打造最舒适的 TypeScript 开发环境 3.进入类型的世界:理解原始类型与对象类型 4.掌握字面量类型与枚举,让你的类型再精确一些 5.函数与 Class 中的类型:详解函数重载与面向对象 6.探秘内置类型:any、unknown、never 与类型断言 7.类型编程好帮手:TypeScript 类型工具(上) 8.类型编程好帮手:TypeScript 类型工具(下) 9.类型编程基石:TypeScript 中无处不在的泛型 10.结构化类型系统:类型兼容性判断的幕后 11.类型系统层级:从 Top Type 到 Bottom Type 12.类型里的逻辑运算:条件类型与 infer 13.内置工具类型基础:别再妖魔化工具类型了! 14.反方向类型推导:用好上下文相关类型 15.数类型:协变与逆变的比较 16.了解类型编程与类型体操的意义,找到平衡点 17.内置工具类型进阶:类型编程进阶 18.基础类型新成员:模板字符串类型入门 19.类型编程新范式:模板字符串工具类型进阶 20.工程层面的类型能力:类型声明、类型

    3gpp-29504-j20.docx

    本文档是3GPP组织发布的关于5G系统中统一数据仓库服务(UDR)的技术规范,旨在为第三阶段(Relase 19)提供协议和数据模型的详细定义。该规范主要针对Nudr接口,规定了通过此接口NF服务消费 限时福利!送硅基流动100w deepseek token,支持api调用:https://cloud.siliconflow.cn/i/VkH0G5VX

    西门子G120 Vf和矢量控制的区别及相关参数设置

    西门子G120 Vf和矢量控制的区别及相关参数设置

    【宝城期货-2025研报】短期降息预期落空,国债期货震荡筑底.pdf

    【宝城期货-2025研报】短期降息预期落空,国债期货震荡筑底.pdf

    基于yolov5识别算法实现的DNF自动脚本源码.zip

    基于yolov5识别算法实现的DNF自动脚本源码.zip

    HR人力资源管理系统PersonManage

    HR人力资源管理系统PersonManage

    【宝城期货-2025研报】有色日报:有色午后走强,铜增仓上行.pdf

    【宝城期货-2025研报】有色日报:有色午后走强,铜增仓上行.pdf

    商城程序电脑端手机端微信端三合一板

    商城程序电脑端手机端微信端三合一板

    基于SpringBoot的个人理财系统(源码+数据库+万字文档)292

    个人理财系统,系统包含两种角色:管理员、用户,系统分为前台和后台两大模块,主要功能如下。 【管理员】: 个人中心:管理员可以在个人中心查看和修改自己的个人信息。 用户管理:管理员可以对用户进行管理,包括添加新用户、编辑用户信息、删除用户以及查看用户列表。 账单类型管理:管理员可以管理账单类型,包括添加新的账单类型、编辑账单类型信息、删除账单类型以及查看账单类型列表。 【用户】: 个人中心:用户可以在个人中心查看和修改自己的个人信息。 收入账单管理:用户可以添加和管理收入账单,包括记录收入的金额、时间、来源等信息,查看、编辑和删除已记录的收入账单。 支出账单管理:用户可以添加和管理支出账单,包括记录支出的金额、时间、用途等信息,查看、编辑和删除已记录的支出账单。 理财计划管理:用户可以制定和管理理财计划,包括设定目标、计划时间、计划金额等信息,查看、编辑和删除已设定的理财计划。 统计分析管理:用户可以查看自己的收入和支出情况的统计分析结果。 备忘录管理:用户可以添加、编辑和删除备忘录。 二、项目技术 编程语言:Java 数据库:MySQL 项目管理工具:Maven 前端技术Vue

    51-图解分布式训练(七)—— accelerate 分布式训练 详细解析.pdf

    面试题关注有更多资源,私信免费的

    【宝城期货-2025研报】宝城期货橡胶早报.pdf

    【宝城期货-2025研报】宝城期货橡胶早报.pdf

    20210928-以面向对象思想编写单片机程序.zip

    以面向对象思想编写单片机程序

    更新!中国各区县-平均风速数据(1951-2024年)

    ## 介绍 平均风速是描述一个地区风力强弱的重要气象指标,是指空间某一点,在给定的时段内各次观测的风速之和除以观测次数,其广泛应用于气候研究、农业、风能开发等领域 本分享数据包含中国各区县的平均风速数据,涵盖了1951年至2024年之间共21w+条数据,数据按年度进行整理 ## 一、中国各区县平均风速数据的介绍 数据年份:1951-2024年 数据范围:区县 数据格式:面板数据 样本数量:21万+ ## 二、数据指标

    Delphi 12.3控件之UPX-4.2.2(压缩exe文件).rar

    UPX_4.2.2(压缩exe文件).rar

    基于Python Tkinter的智能书库管理系统代码

    基于Python Tkinter的智能书库管理系统代码

Global site tag (gtag.js) - Google Analytics