SI DSL:AMQP队列的流定义中handle()和channel()之间的差异

时间:2017-03-24 17:18:49

标签: spring-integration

我已经查看了我能找到的文档,并且没有找到答案,所以希望能在这里获得一些启示。这两个电话之间有什么区别吗?

{
  "category1": [
    [
      "http://url1",
      "URL 1 Title"
    ],
    [
      "http://url2",
      "URL 2 Title"
    ]
  ],
  "category2": [
    [
      "http://url3",
      "URL 3 Title"
    ]
  ],
  "category3": [
    [
      "http://url4",
      "URL 4 Title"
    ]
  ]
}

1 个答案:

答案 0 :(得分:0)

首先让我们以任何方式回到Reference Manual

  

在4.3版之前,AMQP支持的通道仅支持具有Seri​​alizable有效负载和标头的消息。整个消息被转换(序列化)并发送到RabbitMQ。现在,您可以将extract-payload属性(或使用Java配置时的setExtractPayload())设置为true。当此标志为true时,将转换消息有效内容并映射标头,其方式与使用通道适配器时类似。这允许AMQP支持的通道与非可序列化的有效载荷一起使用(可能与另一个消息转换器,如Jackson2JsonMessageConverter)。第11.12节“AMQP消息头”中讨论了默认的映射头。您可以使用outbound-header-mapper和inbound-header-mapper属性提供自定义映射器来修改映射。您现在还可以指定默认传递模式,用于在没有amqp_deliveryMode标头时设置传递模式。默认情况下,Spring AMQP MessageProperties使用PERSISTENT传送模式。

因此,通常(默认情况下)Amqp.channel(connectionFactory)会将整个Message<?>发送到目标队列。同时Amqp.outboundAdapter(amqpTemplate)完全相反 - 将payload映射到body和标题:

if (this.amqpTemplate instanceof RabbitTemplate) {
        MessageConverter converter = ((RabbitTemplate) this.amqpTemplate).getMessageConverter();
        org.springframework.amqp.core.Message amqpMessage = MappingUtils.mapMessage(requestMessage, converter,
                getHeaderMapper(), getDefaultDeliveryMode());
        addDelayProperty(requestMessage, amqpMessage);
        ((RabbitTemplate) this.amqpTemplate).send(exchangeName, routingKey, amqpMessage, correlationData);
}

AMQP支持的频道针对persistence,不应在依赖于消息内容的逻辑中使用。