Можно ли получить неразведенные сообщения в amqp?

Использование веб-интерфейса RabbitMQ. Когда я публикую в обмене темами без текущих привязок очереди, rabbitmq говорит, что сообщение было опубликовано, но не перенаправлено.

Используя amqp.node, когда я связываю очередь с обменом и начинаю использовать "#" (все), я ничего не получаю.

Я ожидаю получить ранее опубликованное, но не отправленное сообщение. Это возможно?

2 ответа

Я ожидаю получить ранее опубликованное, но не отправленное сообщение. Это возможно?

это невозможно напрямую.

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

Ваши варианты обходных путей очень ограничены. Вы всегда должны убедиться, что сообщение направлено в очередь.

это можно сделать, если вы используете альтернативный обмен ( https://www.rabbitmq.com/ae.html) для маршрутизации сообщений, которые никуда не ведут, через другой обмен.

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

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

Вы ищете это: https://www.rabbitmq.com/ae.html

Укажите альтернативный обмен, если сообщение не было маршрутизировано.

Обрабатывать неотправленные сообщения можно с помощью mandatory пометить и добавить ReturnListener в этом случае:

    final Connection connection = factory.newConnection();
            final Channel channel = connection.createChannel();

            channel.addReturnListener(new ReturnListener() {
                public void handleReturn(int replyCode, String replyText, String exchange, String routingKey, AMQP.BasicProperties properties, byte[] body) throws IOException {

                    System.out.println("unrouted  messages here!!!");

                }
            });
     bool isMandatory = true;
      channel.basicPublish("my_exchange","not_routed",isMandatory,null,"not_routed_message".getBytes());

Я не знаю, если php библиотека поддерживает этот слушатель, но стандартный клиент может сделать это.

что это то, что пользовательский интерфейс делает, чтобы показать сообщение:

Message published, but not routed.

проверьте это: https://github.com/rabbitmq/rabbitmq-management/blob/0f1013c57a7341a7fb0afc73d5b6b63fd9275c6d/src/rabbit_mgmt_wm_exchange_publish.erl#L73

Другие вопросы по тегам