消息通道
虽然 Message 在封装数据方面扮演着关键角色,但真正实现消息生产者与消费者解耦的是 MessageChannel。
章节总结
📄️ MessageChannel 接口
Spring Integration 的顶层 MessageChannel 接口定义如下:
📄️ 消息通道实现
Spring Integration 提供了多种消息通道实现。以下各节将简要介绍每一种实现。
📄️ 通道拦截器
消息架构的优势之一在于,它能够以非侵入的方式提供通用行为,并捕获系统中传递的消息的有意义信息。由于消息实例通过消息通道进行发送和接收,这些通道为拦截发送和接收操作提供了机会。通道拦截器策略接口(如下列表所示)为这些操作提供了相应的方法:
📄️ 消息模板
在介绍端点及其各种配置选项时,Spring Integration 为消息传递组件提供了基础,使得消息系统能够以非侵入式方式调用应用程序代码。然而,有时也需要从应用程序代码中调用消息系统。为便于实现此类用例,Spring Integration 提供了 MessagingTemplate,支持跨消息通道的多种操作,包括请求和应答场景。例如,可以发送请求并等待应答,如下所示:
📄️ 配置消息通道
要创建消息通道实例,您可以使用 XML 配置中的 \<channel/> 元素,或 Java 配置中的 DirectChannel 实例,如下所示:
📄️ 特殊通道
默认情况下,在应用程序上下文中定义了两个特殊通道:errorChannel 和 nullChannel。nullChannel(NullChannel 的实例)的作用类似于 /dev/null,它会将发送给它的任何消息记录在 DEBUG 级别并立即返回。对于传输消息的 org.reactivestreams.Publisher 负载,会进行特殊处理:虽然数据会被丢弃,但会立即在此通道中订阅它,以启动响应式流处理。来自响应式流处理的错误(参见 Subscriber.onError(Throwable))会在 warn 级别记录,以便进行可能的调查。如果需要对此类错误进行任何处理,可以将带有 Mono.doOnError() 自定义的 ReactiveRequestHandlerAdvice 应用于向此 nullChannel 生成 Mono 回复的消息处理器。每当您遇到不关心的回复的通道解析错误时,可以将受影响组件的 output-channel 属性设置为 'nullChannel'(名称 'nullChannel' 在应用程序上下文中是保留的)。