Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Rabbitmq死信交换不工作,导致无限次重试_Java_Rabbitmq_Spring Rabbit - Fatal编程技术网

Java Rabbitmq死信交换不工作,导致无限次重试

Java Rabbitmq死信交换不工作,导致无限次重试,java,rabbitmq,spring-rabbit,Java,Rabbitmq,Spring Rabbit,我有一个制片人: rabbitTemplate.convertAndSend(QueueConstants.PROVISIONING_EXCHANGE, QueueConstants.PROVISIONING_ROUTING_KEY, message); 和我的配置: @Bean Queue organizationProvisioningQueue() { return QueueBuilder.durable(QueueConstants.PROVISIONING_QUEUE)

我有一个制片人:

rabbitTemplate.convertAndSend(QueueConstants.PROVISIONING_EXCHANGE, QueueConstants.PROVISIONING_ROUTING_KEY, message);
和我的配置:

@Bean
Queue organizationProvisioningQueue() {
    return QueueBuilder.durable(QueueConstants.PROVISIONING_QUEUE)
            .withArgument("x-dead-letter-exchange", "")
            .withArgument("x-dead-letter-routing-key", QueueConstants.DEAD_LETTER_QUEUE)
            .build();
}

@Bean
Queue deadLetterQueue() {
    return QueueBuilder.durable(QueueConstants.DEAD_LETTER_QUEUE).build();
}

@Bean
DirectExchange exchange() {
    return new DirectExchange(QueueConstants.PROVISIONING_EXCHANGE);
}

@Bean
Binding binding() {
    return BindingBuilder.bind(organizationProvisioningQueue()).to(exchange()).with(QueueConstants.PROVISIONING_ROUTING_KEY);
}
和我的信息处理器:

@RabbitListener(queues = QueueConstants.PROVISIONING_QUEUE)
public void process(ProvisioningMessage message) throws ProvisioningException {
    System.out.println("Processing " + message);

    throw new ProvisioningException ("Some ex " + message);
}
以及常数:

public static final String PROVISIONING_EXCHANGE = "provisioning-exchange";
public static final String PROVISIONING_ROUTING_KEY = "provisioning";
public static final String PROVISIONING_QUEUE = "provisioning-queue";

public static final String DEAD_LETTER_QUEUE = PROVISIONING_QUEUE + ".dlq";
死信队列不起作用,因为每次抛出异常后,消息都会重新排队,导致无限循环,而不是转到死信队列

自从有人建议之后,我也将队列名称改为以.dlq结尾,但仍然没有成功。
我做错了什么?

您需要抛出一个
AmqpRejectAndDontRequeueException
,或者将侦听器容器的
defaultRequeueRejected
属性设置为
false


dlq的名称是不相关的。

最近我遇到了类似的问题(异常情况下无限重请求消息)。在我的案例中,设置此应用程序属性解决了以下问题:

spring.rabbitmq.listener.simple.default-requeue-rejected=false

RabbitMQ中的毒药消息处理从RabbitMQ 3.8.0开始,通过使用新类型的队列:仲裁队列,它就可用了

仲裁队列支持处理有害消息,也就是说,导致使用者重复重新请求传递(可能是由于使用者失败)的消息,因此该消息永远不会被完全和肯定地使用,以便RabbitMQ可以将其标记为删除

请注意,仲裁队列当前不支持某些功能:

仲裁队列跟踪未成功传递尝试的次数,并将其显示在任何重新传递邮件中包含的“x-delivery-count”标头中

可以使用策略参数delivery limit为队列设置传递限制。当返回的消息次数超过限制时,消息将被丢弃或以死信形式显示(如果配置了DLX)


第一个选项不是我想要的,因为我想在抛出错误时进行指数退避,这样只有第五个请求会转到dlq,第二个选项我在application.properties中设置spring.rabbitmq.listener.default requeue rejected=false,但消息仍然会无限地重新排队。这对我来说毫无意义;一定是出了什么事。但是,如果您使用的是重试,则可以在重试侦听器中配置一个
拒绝和dontrequeuerecoverer
,当重试次数用尽时,它将拒绝消息。