java—如何通过spring将消息重新添加到rabbit mq队列的后面

amrnrhlw  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(304)

我正在编写一个springboot rabbitmq使用者,需要偶尔将消息重新排队到队列的后面
我以为这就是否定性承认的作用,但是 basicReject(deliveryTag, true) 只需将消息放回尽可能靠近其在队列中的原始位置,在我的一次一个的情况下,该位置正好位于队列的前面。
我的第一个想法是在某个时间间隔使用死信队列反馈到消息队列(类似于本回答中提到的方法),但是如果有某种方法可以简单地将队列重新排队到初始队列的后面,我宁愿不创建额外的队列
我下面的结构只是使用消息,无法将其重新添加到队列中。
如果没有dlq,如何实现这一点?

@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...
        }
    }
eh57zj3b

eh57zj3b1#

热释光;dr:在没有中间层的情况下,我无法将消息从侦听服务转发回原始队列。
有几个选项围绕死信队列/死信交换,但我们发现的一个非dlq/dlx解决方案是定时交换,如果您愿意的话,是psuedo-dlx。基本上:
消息进入messageexchange(msgx),它传播到服务队列(svcq)。服务(svc)从svcq获取消息。
一旦您确定消息应该发送到svcq的后面,svc应该:
向svcq发送确认。
将消息发送到另一个exchange,我们的定时psuedo dlx
psuedo dlx可以配置为将消息发布到(的背面!!)某时间间隔上的svcq

相关问题