AMQP 支持的发布-订阅通道和消息转换
AMQP-backed publish-subscribe channel and message conversion
我们在基于服务的应用程序中使用 <int-amqp:publish-subscribe-channel/>
作为一种事件总线。发送方法以及消息处理程序基于 spring-messaging 中的 Message
class(从 spring-integration 4.0 (+) 开始。事件是对需要由其他服务拾取的实体。
问题是:spring-messaging Message
class 被 spring-amqp 视为任意对象负载,因为它不被识别为 spring-amqpMessage
。这会导致以下问题:
- 默认消息格式是序列化的 Java 对象。 spring-amqp 不仅序列化了我们的原始有效负载对象,而且还序列化了 spring-messaging
Message
,这在 Spring Framework 4.0 和 4.1
- 为 JSON(准确地说是
Jackson2JsonMessageConverter
)配置消息转换器并不能解决问题,因为它还转换了 Message
实例 - 即 spring-integration 的 GenericMessage
,并且无法从 JSON 实例化,因为它缺少合适的构造函数
我们需要混合 Spring 版本,因为我们有使用 Grails 2.4(基于 Spring 4.0)和当前的 Spring Boot(依赖于 Spring 4.1).
有什么办法解决这个问题,最好是惯用的 spring 集成方式?除了 PublishSubscribeAmqpChannel
之外,是否还有其他抽象?或者我们可以应用的任何其他消息转换方式?
不使用 amqp-backed 频道,而是使用 outbound-channel-adapter 发送和 inbound-channel-adapter 接收。
通道保存整个消息(序列化),而适配器将有效负载作为消息 body 和(可选)映射 headers to/from amqp headers 进行传输。
您需要为 pub/sub 配置一个扇出交换器(频道将默认创建一个名为 si.fanout.<channelName>
的交换器。然后您可以为每个接收者绑定一个 queue。
我们在基于服务的应用程序中使用 <int-amqp:publish-subscribe-channel/>
作为一种事件总线。发送方法以及消息处理程序基于 spring-messaging 中的 Message
class(从 spring-integration 4.0 (+) 开始。事件是对需要由其他服务拾取的实体。
问题是:spring-messaging Message
class 被 spring-amqp 视为任意对象负载,因为它不被识别为 spring-amqpMessage
。这会导致以下问题:
- 默认消息格式是序列化的 Java 对象。 spring-amqp 不仅序列化了我们的原始有效负载对象,而且还序列化了 spring-messaging
Message
,这在 Spring Framework 4.0 和 4.1 - 为 JSON(准确地说是
Jackson2JsonMessageConverter
)配置消息转换器并不能解决问题,因为它还转换了Message
实例 - 即 spring-integration 的GenericMessage
,并且无法从 JSON 实例化,因为它缺少合适的构造函数
我们需要混合 Spring 版本,因为我们有使用 Grails 2.4(基于 Spring 4.0)和当前的 Spring Boot(依赖于 Spring 4.1).
有什么办法解决这个问题,最好是惯用的 spring 集成方式?除了 PublishSubscribeAmqpChannel
之外,是否还有其他抽象?或者我们可以应用的任何其他消息转换方式?
不使用 amqp-backed 频道,而是使用 outbound-channel-adapter 发送和 inbound-channel-adapter 接收。
通道保存整个消息(序列化),而适配器将有效负载作为消息 body 和(可选)映射 headers to/from amqp headers 进行传输。
您需要为 pub/sub 配置一个扇出交换器(频道将默认创建一个名为 si.fanout.<channelName>
的交换器。然后您可以为每个接收者绑定一个 queue。