2015-08-11 2 views
4

У меня есть существующая очередь, созданная в RabbitMQ. Он может быть создан с параметром x-dead-letter-exchange или без него. Я создаю пользователя этой очереди весной, используя RabbitTemplate. Когда я объявляю очередь, я не хочу указывать параметр x-dead-letter-exchange. Я хотел бы, чтобы шаблон каким-то образом определял его сам или не заботился. Я бросаю AmqpRejectAndDontRequeueException от своего потребителя, чтобы указать плохие сообщения, но я хочу, чтобы создатель очереди отвечал за решение, создавать ли обмен и очередь для отклоненных сообщений.Весна с AMQP и RabbitMQ, очередь с опциональным x-dead-letter-exchange

Вот мой боб, который объявляет очереди в Spring:

@Bean 
Queue queue() { 
    Map<String, Object> args = new HashMap<>(); 
    // set the queue with a dead letter feature 
    args.put("x-dead-letter-exchange", REJECTED_EXCHANGE); 
    args.put("x-dead-letter-routing-key", REJECTED_ROUTING_KEY); 
    Queue queue = new Queue(Constants.QUEUE_NAME, false, false, false, args); 
    return queue; 
} 

Это работает отлично, но когда создатель очереди решает не использовать мертвую функцию письма, я вижу следующее сообщение об ошибке:

Channel shutdown: channel error; protocol method: #method<channel.close> 
(reply-code=406, reply-text=PRECONDITION_FAILED - 
inequivalent arg 'x-dead-letter-exchange' for queue 'queueName' 

Сообщение немного длиннее, оно продолжает сообщать мне, какая сторона имеет то, что x-dead-letter-exchange (нет или имя обмена). Я пробовал разные комбинации (например, создавая очередь с обменом, а не указывая ее весной или создавая очередь без обмена и указывая ее весной), только чтобы увидеть разные варианты этого сообщения.

Как объявить очередь, чтобы она просто принимала любые параметры, уже установленные в очереди?

+0

При объявлении объектов RabbitMQ, таких как очереди и обмены, вы должны указать одни и те же параметры, RabbitMQ не будет выполнять слияние каких-либо параметров. Как вы это делаете с весной, я не знаю. –

ответ

1

Как вы можете видеть в spring docs: The RabbitMQ broker will not allow declaration of a queue with mismatched arguments., так что вы не можете этого сделать.
В API-интерфейсе RabbitMQ Java существует метод проверки того, существует ли очередь: queueDeclarePassive.

Если Spring AMQP API предоставляет аналогичную функциональность, вы можете использовать его, прежде чем пытаться объявить очередь.

Смежные вопросы