Вам необходимо подписаться на все очереди, на которые были отправлены сообщения, и использовать их с помощью ack.
Например, если вы публикуете на тему обмена с «тестом» в качестве ключа маршрутизации, и есть 3 постоянных очереди, которые подписываются на «тест», вам нужно будет использовать эти три очереди. Возможно, было бы лучше добавить еще одну очередь, которую также будут слушать ваши потребительские процессы, и попросите их игнорировать эти сообщения.
Альтернативой, поскольку вы используете RabbitMQ, является создание настраиваемого обменного плагина, который будет принимать некоторую командную команду для очистки всех очередей. Например, у вас может быть этот обмен, который читает специальный заголовок сообщения, который сообщает ему очистить все очереди, которым предназначено это сообщение. Это требует написания кода Erlang, но есть 4 разных типа обмена, поэтому вам нужно будет скопировать наиболее похожий код и написать код для новых bahaviours. Если для этого используются только пользовательские заголовки, то тело сообщения может быть нормальным сообщением для потребителей.
Подводя итог:
1) издатель должен потреблять сообщения сам 2) издатель может отправить специальное сообщение в специальную очередь, чтобы сказать потребителям игнорировать сообщение 3) издатель может отправить специальное сообщение для пользовательского обмена, которое очистит все существующие сообщения от очередей до отправки этого специального сообщения потребителям.
Нет, это решает другую проблему. Мне не нужно отклонять сообщение на стороне потребителя, я хочу отменить его доставку со стороны производителя, чтобы сообщение не дошло до потребителя, как если бы оно вообще не существовало. В моей проблеме потребитель не может решить, следует ли отклонять сообщение. – jkff
Если сообщения успешно опубликованы, и вам нужно удалить их из известной очереди, затем подписаться на нее и использовать их в качестве производителя. –