Обмен мертвыми буквами Rabbitmq не работает, что приводит к бесконечным повторам - PullRequest
0 голосов
/ 16 марта 2020

У меня есть производитель:

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";

Очередь недоставленных сообщений не работает, поскольку сообщение помещается в очередь каждый раз после того, как генерируется исключение, что приводит к бесконечному l oop вместо перехода в очередь недоставленных сообщений.

Я изменил имя своей очереди, чтобы оно заканчивалось на .dlq, так как это было предложено, но все еще безуспешно. Что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 27 марта 2020

Недавно у меня была похожая проблема (бесконечный запрос сообщения в случае исключения). В моем случае настройка этого свойства приложения решала проблему:

spring.rabbitmq.listener.simple.default-requeue-rejected=false
0 голосов
/ 31 марта 2020

Обработка ядовитых сообщений в RabbitMQ доступна с RabbitMQ 3.8.0 с использованием нового типа очереди: очереди кворума.

enter image description here

Очередь кворума поддерживает обработку вредоносных сообщений, то есть сообщений, которые заставляют потребителя повторно запрашивать доставку (возможно, из-за сбоя потребителя), так что сообщение никогда не используется полностью и положительно подтверждается, так что оно может быть помечено для удаления RabbitMQ. .

Помните, что некоторые функции в настоящее время не поддерживаются очередями кворума:

enter image description here

Очереди кворума отслеживают количество неудачных попыток попытки доставки и выставить его в заголовке «x-delivery-count», который включен в любое доставленное сообщение.

Можно установить предел доставки для очереди, используя аргумент политики, delivery-limit. Если сообщение было возвращено больше раз, чем предельное значение, оно будет отброшено или введено без букв (если настроен DLX).

enter image description here

0 голосов
/ 16 марта 2020

Вам нужно либо выбросить AmqpRejectAndDontRequeueException, либо установить для свойства defaultRequeueRejected контейнера слушателя значение false.

Имя dlq не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...