当前位置: 首页 > 知识库问答 >
问题:

使用Spring AMQP向侦听器发送延迟消息

明安阳
2023-03-14

我需要在一定的持续时间后将消息发送给MessageListener,所以有没有任何方法可以使用SpringAMQP实现。

如。Producer生成消息并将消息发送到RabbitMQ Q,该消息立即被侦听器接收到,我想延迟消费者端接收到的消息,比如说在一些配置参数(比如1000ms)之后

共有2个答案

虞承泽
2023-03-14

如果你使用Spring引导,它可以是这样的:

@Bean
Queue queue() {
    return QueueBuilder.durable(queueName)
            .withArgument("x-dead-letter-exchange", dlx)
            .withArgument("x-dead-letter-routing-key", dlq)
            .build();
}


@Bean
TopicExchange exchange() {
    return (TopicExchange) ExchangeBuilder.topicExchange(topicExchangeName)
            .delayed()
            .build();

@Bean
Binding binding() {
    return BindingBuilder.bind(queue()).to(exchange()).with(queueName);
}
糜宜民
2023-03-14

RabbitMQ为此提供了延迟交换功能。

从1.6版开始,Spring AMQP还提供了关于此问题的高级API:http://docs.spring.io/spring-amqp/reference/html/_reference.html#delayed-信息交换:

<rabbit:topic-exchange name="topic" delayed="true" />
MessageProperties properties = new MessageProperties();
properties.setDelay(15000);
template.send(exchange, routingKey,
        MessageBuilder.withBody("foo".getBytes()).andProperties(properties).build());

使现代化

在Spring AMQP1.6之前,您应该这样做:

@Bean
CustomExchange delayExchange() {
    Map<String, Object> args = new HashMap<String, Object>();
    args.put("x-delayed-type", "direct");
    return new CustomExchange("my-exchange", "x-delayed-message", true, false, args);
}

...

MessageProperties properties = new MessageProperties();
properties.setHeader("x-delay", 15000);
template.send(exchange, routingKey,
        MessageBuilder.withBody("foo".getBytes()).andProperties(properties).build());

另请参见此问题及其答案:Spring AMQP RabbitMq中的计划/延迟消息传递

 类似资料:
  • 如何延迟JMS消息发送或在不确定的时间内继续? 我使用的是Weblogic,正如您所知,在JMS发送之后,接收方将异步处理消息,但是,此时或有时外部资源还没有为接收方做好准备,因此,我想使用一些检查逻辑来延迟发送或处理消息。我猜例如:我将消息放入挂起队列,然后频繁检查资源可用性,一旦发送或继续消息? 大家都知道Weblogic是否支持这一点,或者如何实现它吗?

  • 兔子配置: 应用概述:每当gitRepository连接到我们的应用程序时,存储库名称就会成为交换名称,在这种情况下,然后存储库的每个分支都会创建自己的队列,这里有两个队列和。现在每次在开发分支中创建拉取请求时,我都需要将信息传递给开发队列,并且应该由特定的侦听器侦听,该侦听器应该仅注册用于开发。我看到了动态队列的示例,但我似乎找不到任何关于如何创建将使用不同线程执行的动态侦听器的示例,我如何实现

  • 我在Spring消息中使用Stomp over SockJS。我正在尝试在连接新用户时向所有登录用户发送消息。首先,这是我的听众: 我的WebSocket配置 我的JS配置 我在这里的问题是,我的template.convert和发送()在应用程序监听器中不工作。但是,如果我把它放在一个带有@Message映射注释的Controller方法中,它将工作,并且我将有一个控制台日志客户端。 所以我的问

  • 我目前正在一个项目中从RxJava切换到Kotlin coroutines,用coroutine含水层替换所有单一和可观察的返回类型。我仍然在为以下结构而挣扎:一个接口(例如存储库的接口)提供数据查询访问并返回一个RxJava single。该实现使用Single.Create创建单个对象,并使用onSuccess/onError发出结果。现在,实现检索数据所需要做的是创建一个带有回调的侦听器,并

  • 问题内容: 这个问题是密切相关的这一个(已回答)。 在整个项目中,我使用JSF命令按钮在屏幕之间导航,其中action属性将指向返回字符串的函数。字符串是新屏幕的名称,例如 将返回一个字符串,例如,它将引导用户 出于移动目的,我不得不使用ajax调用来使clickable,例如 这有效,我已经测试过了,并且返回了正确的结果(在返回之前测试并记录了它) 但是,没有重定向发生。Ajax调用尚未完成。如