Spring AMQP Inbound Adapter с пустым именем очереди - PullRequest
0 голосов
/ 25 мая 2018

Я разрабатываю потребительское приложение, используя Spring AMQP , которое получает сообщения от RabbitMQ.Объявлен обмен темами.Для подключения к Rabbit я создаю очередь с пустым именем, потому что брокер предоставит автоматическое имя очереди , см. спецификации :

@Bean
public TopicExchange exchange() {
    TopicExchange topicExchange = new TopicExchange(topicExchangeName);
    topicExchange.setShouldDeclare(false);
    return topicExchange;
}

@Bean
public Queue queue() {
  return new Queue("", queueDurable, queueExclusive, queueAutoDelete, queueParameters);
}

@Bean
public Binding binding(Queue queue, TopicExchange exchange) {
    return BindingBuilder.bind(queue).to(exchange).with(routingKey);
}

Но когдаЯ пытаюсь настроить Адаптер входящего канала AMQP с помощью Java DSL Spring Integration:

@Autowired
private Queue queue;

@Bean
public IntegrationFlow amqpInbound(ConnectionFactory connectionFactory) {
  return IntegrationFlows.from(Amqp.inboundAdapter(connectionFactory, queue))
      .handle(m -> System.out.println(m.getPayload()))
      .get();
}

Я получаю сообщение об ошибке 'queueName' не может быть пустым или пустым

2018-05-25 13:39:15.080 ERROR 14636 --- [erContainer#0-1] o.s.a.r.l.SimpleMessageListenerContainer : Failed to check/redeclare auto-delete queue(s).

java.lang.IllegalArgumentException: 'queueName' cannot be null or empty
    at org.springframework.util.Assert.hasText(Assert.java:276) ~[spring-core-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.amqp.rabbit.core.RabbitAdmin.getQueueProperties(RabbitAdmin.java:337) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.redeclareElementsIfNecessary(AbstractMessageListenerContainer.java:1604) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:963) [spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_162]

Как установить значение имени очереди сообщений в пустую строку?

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Проблема AMQP-816 была исправлена ​​и теперь доступна в Spring Boot 2.1.0 .

Обновление родительского элемента проекта устраняет проблему:

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.1.0.RELEASE</version>
</parent>

Пустое имя очереди

spring:
    rabbitmq:
        queue:
            name:
            durable: false
            exclusive: true
            autoDelete: true

создает автоматическое имя очереди amq.gen-U1vKiSfIvy8bO11jLD29Sw :

Empty queue name

Непустое имя очереди

spring:
    rabbitmq:
        queue:
            name: abc
            durable: false
            exclusive: true
            autoDelete: true

создает очередь с именем abc :

Non-empty queue name

0 голосов
/ 25 мая 2018

Это не очень хорошее решение.

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

AnonymousQueue решает эту проблему с помощью структуры, генерирующей случайное имя.

Но анонимные очереди не являются долговременными,исключают и автоматически удаляют.

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

@Bean
public Queue queue() {
  return new Queue(new AnonymousQueue.Base64UrlNamingStrategy().generateName(),
      queueDurable, queueExclusive, queueAutoDelete, queueParameters);
}

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

...