首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过Spring将消息请求到兔子MQ队列的后面

如何通过Spring将消息请求到兔子MQ队列的后面
EN

Stack Overflow用户
提问于 2020-11-19 21:55:15
回答 1查看 604关注 0票数 3

我正在编写一个SpringBoot RabbitMQ使用者,我需要偶尔将消息重新排队到队列的后面

我认为这是负面确认的工作方式,但basicReject(deliveryTag, true)只是尽可能地将消息放回它在队列中的原始位置,而在我的“一个时间”的情况下,它就回到了队列的最前面。

我的第一个想法是使用死信队列在某个时间间隔(similar to the approach mentioned in this answer)返回消息队列,但是如果有某种方法简单地将队列重新排到初始队列的后面,我宁愿不创建额外的队列

下面的结构简单地使用了消息,并未能将其重新添加到队列中。

如何在没有DLQ?的情况下实现这一点?

代码语言:javascript
复制
@ServiceActivator(inputChannel = "amqpInputChannel")
    public void handle(@Payload String message,
                       @Header(AmqpHeaders.CHANNEL) Channel channel,
                       @Header(AmqpHeaders.DELIVERY_TAG) Long deliveryTag){

    try{

        methodThatThrowsRequeueError();
        methodThatThrowsMoveToErrorQueueError();

    } catch (RequeueError re) {

        channel.basicAck(deliveryTag, false);
        sendMessageToBackOfQueue(message);
        return;

    } catch (MoveToErrorQueueError me) {
        //Structured the same as sendMessageToBackOfQueue, works fine
        moveMessageToErrorQueue(message);
    }
    
    channel.basicAck(deliveryTag, false);
}

private void sendMessageToBackOfQueue(String message) {
        try {
            rabbitTemplate.convertAndSend(
                exchangeName,
                routingKeyRequeueMessage,
                message,
                message -> {
                    message.getMessageProperties().setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN);
                    return message;
                }
            );
        } catch (AmqpException amqpEx) {
            //error handling which is not triggered...
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-24 18:48:05

TL;DR:我无法在没有中介的情况下将来自侦听服务的消息转发回起始队列。

有几个选项围绕死信队列/死信交换,但我们发现的非DLQ/ DLX解决方案是一个时间Exchange,如果您愿意的话,是一个psuedo DLX。实质上:

消息进入MessageExchange (MsgX),该消息传播到服务队列(SvcQ)。服务(Svc)从SvcQ获得一条消息。

一旦确定消息应该发送到SvcQ的后面,Svc应该:

  1. 向SvcQ发送确认。
  2. 将消息发送到另一个交换,我们的时间psuedo-DLX
  3. psuedo-DLX可以配置为将消息释放到(!!)SvcQ在某些时间间隔

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64920605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档