延迟消息交换

1.6 版本引入了对 延迟消息交换插件 的支持

该插件目前被标记为实验性的,但已经可用一年以上(在撰写本文时)。如果对插件的更改使其成为必要,我们计划尽快添加对此类更改的支持。因此,Spring AMQP 中的这种支持也应被视为实验性的。此功能已使用 RabbitMQ 3.6.0 和插件的 0.0.1 版本进行了测试。

要使用 RabbitAdmin 将交换声明为延迟交换,您可以将交换 Bean 上的 delayed 属性设置为 trueRabbitAdmin 使用交换类型(DirectFanout 等)来设置 x-delayed-type 参数,并使用类型 x-delayed-message 声明交换。

使用 XML 配置交换 Bean 时,也可以使用 delayed 属性(默认值:false)。以下示例显示了如何使用它

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

要发送延迟消息,您可以通过 MessageProperties 设置 x-delay 标头,如以下示例所示

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;
    }

});

要检查消息是否被延迟,请使用 MessageProperties 上的 getReceivedDelay() 方法。 它是一个单独的属性,以避免意外传播到从输入消息生成的输出消息。