【问题标题】:how to prevent message re-queue within rabbitmq server?如何防止rabbitmq服务器中的消息重新排队?
【发布时间】:2016-06-02 22:13:09
【问题描述】:

我正在使用直接交换将消息发布到带有路由键的某些队列,全部在rabbit-server而不是代码中配置,我正在使用spring微服务消费消息然后在接收方法中发生一些故障,然后是消息重新排队导致循环,所以我想用rabbit-server添加一个策略来防止这种重新排队,它可以作为参数添加,同时将队列与特定路由键的交换绑定,或者它应该是政策?

【问题讨论】:

    标签: spring rabbitmq message-queue


    【解决方案1】:

    默认情况下,在任何异常情况下,spring 都会发送带有 requeue “true”的 nack。如果在你的 spring 消费者应用程序中你想发送 requeue false,那么抛出异常“AmqpRejectAndDontRequeueException”。所以你的消费者代码应该看起来像这样:

    `void onMessage(){
      try{
        // Your Code Here
      } catch(Exception e){
         throw new AmqpRejectAndDontRequeueException();
      }
    }`
    

    【讨论】:

    • 感谢您的回复,在我的情况下它没有太大帮助,因为 try 块使用 spring jpa 来保存收到的消息,然后 SqlExceptionHelper(违反唯一约束)发生在我的块中未捕获的其他地方,那么我可以在 rabbit-server 中处理吗?
    • 如果一条消息被消费,要么处理成功,要么处理失败。然后,如果它未能得到处理,那么它应该手动处理或需要被拒绝。在您的情况下,它无法得到处理,异常被传递给 SQLExceptionHelper。那你为什么不把它从你处理那个异常的地方扔掉呢。
    • 因为现在同一个消费者线程正在抛出异常,所以需要控制该线程中的异常并以您的方式抛出它。
    • 感谢 Manmay,我试过了,但是 EventListener 方法出现了一些问题,它使用 Transactional 进行了注释,它试图将消息提交到导致循环的 db,现在它可以在没有 Transactional 的情况下正常工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2016-07-18
    相关资源
    最近更新 更多