(1). 概述
在这里先对Spring Integration的概念有一个大概的了解,后面会进行案例,以及源码剖析.
(2). Message
在Spring Integration中,“消息”是对任何Java对象的一种通用包装,这种包装将会给Java对象附着一些元信息以供消息框架处理.一条“消息”由“消息体”(payload)和“消息头”(header)组成.消息体可以是任何类型,消息头一般用于保存一些必要信息,比如id、时间戳、过期时间和返回地址等.消息头也可以用来在不同的传输协议之间传递参数.比如:当需要包装一个文件来创建一个消息时,可以将文件名保存于消息头中,以供下游的消息组件读取使用.再比如:如果一个消息的内容会最终被Email适配器发出,那么各种属性值(to、from、cc、subject等)可被上游的消息组件保存在消息头中.开发者可以利用消息头来保存任意的键值对.
(3). Channel
“消息通道”对应着“管道-过滤器”架构中的“管道角色”.消息生产者发送消息到通道,消息消费者从通道接收消息.从而,消息通道解耦了消息组件,同时也为消息拦截和监控提供了便利的切入点.
一个消息通道可以是“点对点”意义的,或者也可以是“发布-订阅”意义的.
- 点对点模式的通道,发布到通道中的每个消息,最多只有一个消费者可以接收.
- 发布-订阅模式的通道,则会尝试广播消息给其所有的订阅者.
(4). Message EndPoint
Spring Integration的主要目标之一是通过“控制反转”来简化企业集成解决方案的开发.这意味着你应该不需要直接实现消息消费者和生产者,更不需要构建消息或者在消息通道上调用发送与接收操作.相反地,你只需要关注于你基于普通对象(POJO)实现的特定领域模型.然后,通过”声明式配置”,你可以“连接”业务领域代码到Spring Integration提供的消息基础设施.而负责这些连接的组件就是“消息终端”.这并不是说你必须直接性地连接现有应用.任何真实的企业集成解决方案,都需要一些用于集成相关的逻辑代码,例如路由选择和协议转换.其中暗含的要点就是:实现集成逻辑和业务逻辑的分离.类比来说:作为Web应用中的MVC模式,其目标应该是提供一个简单而专用的层,转换接入的请求到服务层调用,然后再转换服务层响应到请求端.
(5). Transformer
“消息转换器”的作用在于“转换消息的内容或结构,返回翻转换后的消息”.可能最为常见的转换器应用方式就是将消息体(Message Payload)从一种格式转换为另一种格式(例如从XML文档转换成java.lang.String字符串),同样地,转换器也可以被用于添加、删除和修改消息头(Message Header)中的值.
(6). Filter
“消息过滤器”可用来限定消息能否被传送到”输出通道”上.这里仅需要依据一个布尔测试来做判定.该布尔测试检查的范围诸如:“消息是否包含特定类型的消息体”,“检查消息中的某个属性值”,“消息是否包含某个消息头”,等等.如果消息通过检查就会被发送到输出通道,否则,消息将被丢弃(或者更加严格地说,应当抛出异常).消息过滤器通常结合“发布-订阅通道”一起使用,“发布-订阅通道”会使得多个消费者接收到同样的消息,而基于一定的过滤条件设置过滤器则可以减少所需处理的消息数量.
(7). Router
“消息路由器”负责确定消息的下一步传送将由哪些通道接收.通常,路由决策都是基于消息内容和(或)消息头中可用的元数据来完成的.消息路由常常代替静态的配置,作为一种动态地、运行时确定输出通道的装置,接入到“服务激活器”或者其他能够响应消息的装置.另外.针对前文所述的消息多播的场景,相对于被动的“消息过滤器”,“消息路由器”提供了一种主动的控制方式,来确定多个消息订阅者中的消息接收范围.
(8). Splitter
“消息分解器”是另外一种类型的消息终端,它从输入通道中接收消息,然后把接收到的一个消息分解成多个消息,最终把它们发送到对应输出通道上.典型应用场景就是把一个“复合消息”分解成包含原消息各子部分的一组“子消息”.
(9). Aggregator
“消息聚合器”基本上就是“消息分解器”的反模式.它也是一种消息终端类型,接收多条消息,然后把他们合并成一条消息.事实上,聚合器通常出现在消息管道线路中的下游位置,且相对该组件的上游位置往往会存在“消息分解器”.从技术上来说:聚合器往往比分解器更复杂,因为它需要维护状态(也就是维护正被聚合的消息),确定被聚合的整组消息何时可用,以及必要地话,还要处理超时的状况.更进一步地,在超时的情况下,聚合器还要明确是仍然发送残缺消息,或是丢弃它们.对此,Spring Integration提供了可配置的超时处理策略.
(10). Service Activitor
“服务激活器”是一种将“服务实例”连接到“消息系统”的通用终端.对于该类型的终端,配置输入通道是必须的.而且,若被调用的服务方法具有返回值,那么此情况下或需要配置输出通道.
“服务激活器“会调用指定“服务对象(实际就是一个Handler类的实现)“上的操作,来处理请求消息.该过程中会抽取请求消息的消息体并作必要的转换(若方法参数非消息类型参数).每当服务方法产生返回值,这个返回值同样地会作出必要的转换,而成为一条响应消息(若方法返回值非消息类型).响应消息将会被发送到输出通道上.若没有配置输出通道,且消息的“返回地址”可用,那么该响应将会被发送到返回地址指定的通道上
(11). Channel Adapter
“通道适配器”是一种连接消息通道到“其他系统”或是“传输端口”的消息终端.通道适配器分为“接入”或者“接出”两种.通常通道适配器被用来映射消息到其他任何发送/接收系统所需的对象或资源上(比如:文件、HTTP请求,JMS消息等等).依赖于传输端口的情况下,通道适配器也可以填充或是抽取消息头中的值.