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

RabbitMQ Spring中的建议链不工作

陈奇希
2023-03-14

我想实现重试功能(当消费者出现问题时)3次,然后消息应该转到另一个队列(死信交换)。我已按如下方式配置队列/交换

常规邮件交换名称:test\u exchange邮件队列:test\u queue test\u queue绑定到具有路由密钥的test\u exchange test\u queue

死信交换名称:test_dlq_exchange死消息队列:test_dlq_queuetest_dlq_queue用路由密钥绑定test_dlq_exchangetest_dlq_queue

在RabbitMQ UI控制台中,我将“x-dead-letter-exchange”配置为“test\u exchange”

下面是SimpleMessageListenerContainer的代码

  @Bean 
    SimpleMessageListenerContainer getMessageListenerContainer(){
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
    container.setConnectionFactory(connectionFactory);
    container.setQueueNames("test_queue");

    MessageListenerAdapter adapter = new MessageListenerAdapter();
     //configured my message listener class 
     //configured Jackson2JsonMessageConverter as converter
     container.setMessageListener(adapter);
     container.setAdviceChain(new Advice[] {retryAdvice()}
     return container;
    }

    //configuration for retryAdvice

     @Bean 
     public MethodInterceptor retryAdvice{

        ExponentialBackOffPolicy backoffPolicy = new ExponentialBackOffPolicy();
        backoffPolicy.setInitialInterval(10);
        backoffPolicy.setMaxInterval(1000);
        backoffPolicy.setMultiplier(2);
        RabbitTemplate retryTemplate = new RabbitTemplate(connectionFactory());
        retryTemplate.setQueue("test_dl_queue");
        return RetryInterceptorBuilder
                    .stateful()
                    .backOffPolicy(backoffPolicy)
                    .maxAttempts(3)
                    .recoverer(
                       new RepublishMessageRecoverer
                       (retryTemplate,"test_dl_exchange","test_queue")).build();
    }  

我的自定义消息侦听器是消息驱动的POJO,它只有我的MessageObject。

由于我使用的是stateful,所以我启用了createMessageId(true)。在消息侦听器中,我再次调用targetobject的方法。启动容器后,流量循环

i、 e将消息发布到队列-

在日志中,我看到如下内容

      o.s.r.i.StatefulRetryOperationsInterceptor - Executing proxied method in stateful retry public abstract void org.springframework.amqp.rabbitlistener.SimpleMessageListenerContainer$ContainerDelegate.invokeListener(Channel,Message) throws java.lang.Exception(55435ee)

有人能帮我解决这个问题吗?

共有1个答案

柳高卓
2023-03-14

由于您使用的是RePublishMessageRecoverer,因此在代理上配置DLX/DLQ不会做任何事情。为了路由到DLQ,您需要RejectAndDontRequest eueRecover-当重试耗尽时,消息将被发送到DLX/DLQ。

看起来您正在重新发布到同一队列

(retryTemplate,"test_dl_exchange","test_queue"))

因此产生了无限循环。

 类似资料:
  • 下面是我正在使用的配置。消息没有错误,从exchange到队列都可以正常工作,并且侦听器可以进行转换,这很好。对于错误消息,我希望发生的是,当我抛出AmqpRejectAndDontRequeueException时,“rabbitQueue”将消息转发到死信交换,并最终进入“rabbitErrorQueue”但死信交换或队列上没有任何活动。有人知道我做错了什么吗?

  • 问题内容: 我有一个Elasticsearch索引,其中有一些数据。我实现了该功能,所以当用户写错拼写的东西时,它可能会收到带有正确单词的建议。 之所以使用短语建议者,是因为我需要一些简短的短语(例如名称)的建议,问题是索引中不存在某些建议。 例: 我的问题是,索引中没有与指定建议匹配的词组,因此它向我推荐了不存在的词组,因此会给我一个未找到的搜索词。 我该怎么办?短语建议者是否应该为索引中实际存

  • 我试图在IntelliJ中使用ctrl空格键快捷方式来完成代码,但每次我这样做时,它都返回“没有建议”。 这是我的项目目录,即使我键入starter然后按ctrl空格键,即使文件存在于项目目录中,也没有“建议”: 我根据这个线程尝试了以下操作(Intellij IDEA CE 12 Android XML代码完成不起作用): > 转到文件- 转到首选项- 转到文件- 我做错了什么?

  • 我正在开发一个基于区块链的身份识别系统。而且,由于每个项目都将永远在链中,消耗空间,因此我正在考虑添加一个工作证明需求,以便将项目添加到链中。 起初我想到的是比特币,因为这是一种经过尝试和测试的方式来证明这项工作已经完成,但这样做会阻止用户加入,因为比特币还没有被广泛应用。此外,在分布式系统中,不清楚谁应该得到这笔钱。 因此,我正在寻找一种工作证明算法,其复杂性可以根据区块链的增长速度轻松调整,并

  • 问题内容: 尝试在Ubuntu虚拟机上为Arm平台编译Linux内核 它失败如下 尝试安装 在哪里找到正确的包裹?如何将其包含在系统中?(我在网上发现了一些对我不起作用的链接)。如果您能提供正确的解决方案或参考,那就太好了。 问题答案: 从https://sourcery.mentor.com/GNUToolchain/下载arm-2013.05-24-arm-none-linux-gnueabi

  • 由于android中AutoCompleteTextBox中的建议文本的背景颜色和文本颜色相同,所以建议文本是不可见的,我的xml文件是: 我的清单文件是: 我的Java文件是:protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(r.layout.p