Создав базовую настройку spring-amqp, я вижу, что для каждого типа сообщения, которое я хочу отправить (с использованием сообщений POJO), мне нужно объявить очередь в конфигурации spring.
Итак, для каждой пары из них:
amqpTemplate.convertAndSend("queue1", new MessageType1(...));
@RabbitListener(queues = "queue1")
public void handleMessage(MessageType1 msg) {...}
Мне нужна запись в конфигурации spring следующим образом:
<rabbit:queue name="queue1"/>
Мне это кажется излишним. Если я думаю об очередях, таких как URL-адреса HTTP, то достаточно объявить контроллер с @RequestMapping("/some-url")
, нет необходимости также объявлять /some-url
в другом месте конфигурации.
Если в конечном итоге приложение будет иметь много типов сообщений, проходящих через брокера, это просто раздует конфигурацию.
Я вижу два способа избежать этого:
Автоматическое объявление очередей для каждой аннотированной конечной точки прослушивателя. т. е. если есть аннотированная конечная точка прослушивателя
@RabbitListener(queues = "hello")
, то можно сделать вывод, что должна быть объявлена очередьhello
. Я думал, что это может быть уже так, но когда я удалил очередь из конфигурации контекста, я получил следующую ошибку:WARN BlockingQueueConsumer - Failed to declare queue:hello WARN BlockingQueueConsumer - Queue declaration failed; retries left=2 org.springframework.amqp.rabbit.listener.BlockingQueueConsumer$DeclarationException: Failed to declare queue(s):[hello] at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.attemptPassiveDeclarations(BlockingQueueConsumer.java:479) at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:400) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1022)
Использование разных POJO сообщений в одной очереди. Таким образом, отправка
MessageType1
иMessageType2
наqueue1
, каждая из которых достигает другой конечной точки, в зависимости от типа полезной нагрузки. По сути, это создает своего рода единую «очередь приложений», аналогичную схеме базы данных:@RabbitListener(queues = "queue1") public void handleMessage1(MessageType1 msg) {...} @RabbitListener(queues = "queue1") public void handleMessage2(MessageType2 msg) {...}
Попытка этого подхода привела к ошибке.
Возможно ли что-либо из вышеперечисленного в настоящее время с помощью spring-amqp (1.4.0), и если да, то как?