Spring integration AMQP支持的发布-订阅通道和消息转换

Spring integration AMQP支持的发布-订阅通道和消息转换,spring-integration,spring-amqp,Spring Integration,Spring Amqp,在基于服务的应用程序中,我们使用事件总线作为一种事件总线。send方法和消息处理程序都基于spring消息传递中的消息类(从spring integration 4.0+开始)。事件是对需要由其他服务拾取的实体的更改 问题是:spring消息传递消息类被spring amqp视为任意对象负载,因为它不被识别为spring amqp消息。这会导致以下问题: 默认消息格式是序列化的Java对象。SpringAMQP不仅序列化了原始的有效负载对象,而且还封装了spring消息传递消息,这在Spring

在基于服务的应用程序中,我们使用事件总线作为一种事件总线。send方法和消息处理程序都基于spring消息传递中的消息类(从spring integration 4.0+开始)。事件是对需要由其他服务拾取的实体的更改

问题是:spring消息传递消息类被spring amqp视为任意对象负载,因为它不被识别为spring amqp消息。这会导致以下问题:

默认消息格式是序列化的Java对象。SpringAMQP不仅序列化了原始的有效负载对象,而且还封装了spring消息传递消息,这在SpringFramework4.0和4.1之间是不兼容的 将JSON Jackson2JsonMessageConverter的消息转换器配置为精确并不能解决问题,因为它还转换消息实例——这是spring integration的GenericMessage,无法从JSON实例化,因为它缺少适当的构造函数 我们需要混合使用Spring版本,因为我们有基于Spring4.0的Grails2.4实现的服务,而当前的Spring引导依赖于Spring4.1


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

使用出站通道适配器发送,使用入站通道适配器接收,而不是使用支持amqp的通道

通道保存序列化的整个消息,而适配器将有效负载作为消息体传输,并可选地将头映射到amqp头或从amqp头映射头


您需要为发布/订阅配置一个扇出交换通道,该通道将创建一个名为si.fanout的交换通道。默认情况下。然后,您可以为每个收件人绑定一个队列。

我会试试。PublishSubscribeChannel的这种行为是出于设计,还是一个bug?我应该提出一个问题吗?这是设计上的问题,JMS支持的通道中使用了相同的技术,但我认为我们可以通过添加一个选项来进行改进,使用头映射技术,而不是发送整个消息。然而,持久性支持的通道设计用于应用程序内的消息持久性,以避免消息丢失,而不是将消息分发到不同的系统/应用程序;这就是通道适配器的设计目的。我理解持久性支持通道的概念。至少对我来说,AMQP支持的JMS同样被视为持久性支持,而不是远程传输支持,这是非常违反直觉的。IMHO这一点应该在参考指南中明确指出,在参考指南中,对出版渠道的描述充其量是很少的。