【问题标题】:RabbitMQ delayed message plugin - How to show delayed message in admin UI?RabbitMQ 延迟消息插件 - 如何在管理 UI 中显示延迟消息?
【发布时间】:2018-06-08 12:23:37
【问题描述】:

我们使用 rabbitmq 消息延迟插件 (rabbitmq_delayed_message_exchange) 来延迟消息。是否可以出于调试和监控目的,在 rabbitmq 管理 Web 界面中显示持有/延迟的消息?

链接:https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/

再见, 本

【问题讨论】:

  • 您使用的是什么“rabbitmq 管理网页界面”?用更多细节更新您的问题。

标签: rabbitmq spring-rabbit


【解决方案1】:

没有;延迟消息在管理 UI 中不可见。

作为替代方案,您可以将消息路由到真实队列,定义 TTL 以及死信,这将导致过期消息路由到最终队列。

您可以在临时队列上设置固定的 TTL,或对单个消息使用 expiration 属性。

编辑

@SpringBootApplication
public class So50760600Application {

    public static void main(String[] args) {
        SpringApplication.run(So50760600Application.class, args);
    }

    @Bean
    public ApplicationRunner runner(RabbitTemplate template) {
        return args -> template.convertAndSend("", "temp", "foo", m -> {
                m.getMessageProperties().setExpiration("5000");
                return m;
            });
    }

    @RabbitListener(queues = "final")
    public void in(String in, @Header("x-death") List<?> death) {
        System.out.println(in + ", x-death:" + death);
    }

    @Bean
    public Queue temp() {
        Map<String, Object> args = new HashMap<>();
        args.put("x-message-ttl", 10000); // default (max)
        args.put("x-dead-letter-exchange", "");
        args.put("x-dead-letter-routing-key", "final");
        return new Queue("temp", true, false, false, args);
    }

    @Bean
    public Queue finalQ() {
        return new Queue("final");
    }

}

foo:[{reason=expired, original-expiration=5000, count=1, exchange=, time=Fri Jun 08 10:43:42 EDT 2018, routing-keys=[temp], queue=temp}]

【讨论】:

  • 我尝试使用 org.springframework.amqp.core.MessageProperties.setExpiration(String expiration) 对单个消息设置 TTL。但是消息没有过期。过期的值是以毫秒为单位的时间?
  • 是的,女士;对我来说很好;查看我的答案的编辑。
  • 感谢您的示例。我的代码不起作用:MessageBuilder mb = MessageBuilder.fromMessage(msg); // copy msg &lt;br/&gt; Message msgWithDelay = mb.build(); msgWithDelay.getMessageProperties().setExpiration("5000"); // Expiration ist not set in msg msgWithDelay.getMessageProperties().setHeader("TEST", "test"); // works rabbitTemplate.send(msgWithDelay); 任何提示?
  • 如何设置属性应该没有任何区别;但为什么这么复杂?为什么不只是msg.getMessageProperties().setExpiration("5000")
  • 我不明白这个问题。我正在向 Exchange 发送一条延迟的消息。延迟后,Msg 进入队列。消费者拿起消息,设置一个较长的延迟并设置一个较短的到期时间。这里不会发生更多事情。
最近更新 更多