【问题标题】:AMQP-backed publish-subscribe channel and message conversionAMQP 支持的发布-订阅通道和消息转换
【发布时间】:2015-02-26 08:45:28
【问题描述】:

我们在基于服务的应用程序中使用<int-amqp:publish-subscribe-channel/> 作为一种事件总线。 send 方法和消息处理程序基于 spring-messaging 中的 Message 类(从 spring-integration 4.0 (+) 开始。事件是对需要由其他服务获取的实体的更改。

问题是:spring-messaging Message 类被 spring-amqp 视为任意对象有效负载,因为它不被识别为 spring-amqp Message。这会导致以下问题:

  • 默认消息格式是序列化的 Java 对象。 spring-amqp 不仅序列化了我们原来的payload对象,还序列化了spring-messagingMessage,这在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)实现了服务。

有没有办法解决这个问题,最好是惯用的弹簧集成方式?除了PublishSubscribeAmqpChannel,是否还有其他抽象?或者我们可以应用的任何其他消息转换方式?

【问题讨论】:

    标签: spring-integration spring-amqp


    【解决方案1】:

    不要使用 amqp 支持的通道,而是使用 outbound-channel-adapter 发送和 inbound-channel-adapter 接收。

    通道保存整个消息(序列化),而适配器将有效负载作为消息体传输,并且(可选)将标头映射到 amqp 标头/从 amqp 标头映射。

    您需要为 pub/sub 配置一个扇出交换(默认情况下,频道将创建一个名为 si.fanout.<channelName> 的交换。然后您可以为每个收件人绑定一个队列。

    【讨论】:

    • 我会试试的。 PublishSubscribeChannel 的这种行为是设计使然,还是一个错误?我应该打开一个问题吗?
    • 这是设计使然(在 JMS 支持的频道中使用了相同的技术),但我认为我们可以通过添加使用标头映射技术的选项来进行改进而不是发送整个消息。但是,持久化支持的通道是为应用程序内的消息持久性设计的(以避免消息丢失),而不是用于将消息分发到不同的系统/应用程序;这就是通道适配器的设计目的。
    • 我理解持久支持通道的概念。非常违反直觉(至少对我而言)AMQP 支持(对于 JMS 也是如此)被视为支持 persistence 而不是 remote-transport-支持。恕我直言,这应该在参考指南中明确指出,其中 PublishSubscribeAMQPChannel 的描述充其量是稀缺的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 2016-11-25
    • 1970-01-01
    • 2021-02-27
    相关资源
    最近更新 更多