Можно ли получить неразведенные сообщения в 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.