延迟消息交换

版本 1.6 引入了对延迟消息交换插件的支持spring-doc.cadn.net.cn

该插件目前被标记为实验性功能,但已可用超过一年(截至本文撰写时)。</p><p>如果插件发生变更导致必要调整,我们计划尽快添加对这些变更的支持。</p><p>因此,Spring AMQP 中的此功能也应被视为实验性功能。</p><p>该功能已在 RabbitMQ 3.6.0 和插件版本 0.0.1 上进行了测试。

要使用 RabbitAdmin 声明一个交换机为延迟交换机,可将交换机 Bean 上的 delayed 属性设置为 true。该 RabbitAdmin 使用交换机类型(DirectFanout 等)来设置 x-delayed-type 参数,并以 x-delayed-message 类型声明交换机。spring-doc.cadn.net.cn

属性 delayed(默认值:false)在使用 XML 配置交换机(exchange)bean 时也适用。
以下示例展示了如何使用它:spring-doc.cadn.net.cn

<rabbit:topic-exchange name="topic" delayed="true" />

要发送延迟消息,您可以通过 x-delay 头部设置 MessageProperties,如下例所示:spring-doc.cadn.net.cn

MessageProperties properties = new MessageProperties();
properties.setDelay(15000);
template.send(exchange, routingKey,
        MessageBuilder.withBody("foo".getBytes()).andProperties(properties).build());
rabbitTemplate.convertAndSend(exchange, routingKey, "foo", new MessagePostProcessor() {

    @Override
    public Message postProcessMessage(Message message) throws AmqpException {
        message.getMessageProperties().setDelay(15000);
        return message;
    }

});

要检查消息是否延迟,可使用 getReceivedDelay() 方法在 MessageProperties 上调用。该属性为独立设置,以避免将延迟信息意外传播至由输入消息生成的输出消息。spring-doc.cadn.net.cn