Конфигурация весеннего облачного кролика пытается подключиться к localhost 5672

Существует множество примеров, когда java-код используется для настройки чистого кролика, но документация, связанная с загрузкой Spring, - это совсем другая история.

Мое требование довольно простое - одна очередь, один обмен, одна очередь недоставленных сообщений с предопределенными именами. Некоторая политика HA. Развернуто в ключевом облачном цеху.

Приложение должно использовать фабрику облачных подключений, поэтому мне не нужно указывать информацию о подключении. Приложение должно создать очередь / обмен, если они не существуют. Мне нужен контроллер, который может использовать rabbitTemplate для отправки сообщений. Мне нужен слушатель для обработки этих сообщений в нескольких потребительских потоках.

Я попытался использовать подход, основанный только на свойствах. И я перепробовал тонны бобов для этого. Почему-то не хочет подключаться к облачному сервису!

Я использую приложение для весенней загрузки и запускаю его в облачном хранилище

Код

@Configuration
@EnableRabbit
@Profile("cloud")
@Slf4j
public class RabbitMQConfig extends AbstractCloudConfig {

    final static String MAIN_QUEUE_NAME = "pricing";
    private final static String QUEUE_EXCHANGE_NAME = "pricing-exchange";
    private final static String DEAD_LETTER_QUEUE_NAME = "pricing-dl";

    @Autowired
    RabbitProperties rabbitProperties;

    @Bean("pricingQueue")
    @Primary
    public Queue pricingQueue() {
        return QueueBuilder.durable(MAIN_QUEUE_NAME)
                .withArgument("x-dead-letter-exchange", "")
                .withArgument("x-dead-letter-routing-key", DEAD_LETTER_QUEUE_NAME)
                .withArgument("x-queue-master-locator", "min-masters")
                .build();
    }

    @Bean
    public Queue deadLetterQueue() {
        return QueueBuilder.durable(DEAD_LETTER_QUEUE_NAME)
                .withArgument("x-queue-master-locator", "min-masters")
                .build();
    }

    @Bean
    public DirectExchange exchange() {
        return new DirectExchange(QUEUE_EXCHANGE_NAME);
    }

    @Bean
    public Binding pricingBinding(@Qualifier("pricingQueue") Queue pricingQueue,
                                  DirectExchange exchange) {
        return BindingBuilder.bind(pricingQueue).to(exchange).with(MAIN_QUEUE_NAME);
    }

    @Bean
    public MessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}


Я думаю, это происходит потому, что весенняя загрузка создала контейнер слушателя, а не я

Ошибка

Я не уверен, почему у вас есть эти @Configuration @EnableRabbit @Profile("cloud") @Slf4j public class RabbitMQConfig extends AbstractCloudConfig { final static String MAIN_QUEUE_NAME = "pricing"; private final static String QUEUE_EXCHANGE_NAME = "pricing-exchange"; private final static String DEAD_LETTER_QUEUE_NAME = "pricing-dl"; @Autowired RabbitProperties rabbitProperties; @Bean("pricingQueue") @Primary public Queue pricingQueue() { return QueueBuilder.durable(MAIN_QUEUE_NAME) .withArgument("x-dead-letter-exchange", "") .withArgument("x-dead-letter-routing-key", DEAD_LETTER_QUEUE_NAME) .withArgument("x-queue-master-locator", "min-masters") .build(); } @Bean public Queue deadLetterQueue() { return QueueBuilder.durable(DEAD_LETTER_QUEUE_NAME) .withArgument("x-queue-master-locator", "min-masters") .build(); } @Bean public DirectExchange exchange() { return new DirectExchange(QUEUE_EXCHANGE_NAME); } @Bean public Binding pricingBinding(@Qualifier("pricingQueue") Queue pricingQueue, DirectExchange exchange) { return BindingBuilder.bind(pricingQueue).to(exchange).with(MAIN_QUEUE_NAME); } @Bean public MessageConverter jsonMessageConverter() { return new Jackson2JsonMessageConverter(); } } вызовы в определениях компонентов (хотя они закомментированы). НИКОГДА не разговаривайте с брокером в определении bean-компонента - это слишком рано в жизненном цикле.

...

Ошибка в первом журнале заставляет меня думать, что она не была закомментирована. Этот журнал тоже выглядит усеченным - должно быть _2_ частей. Вы никогда не должны обрезать журнал, задавая вопрос. Частичная трассировка стека бесполезна.

...

Заводской метод msgQueueBinding вызвал исключение; вложенное исключение - org.springframework.amqp.AmqpConnectException: java.net.ConnectException: соединение отклонено (соединение отклонено)


person Kalpesh Soni    schedule 16.11.2019    source источник
comment
Я очистил это, и теперь у меня все еще возникают ошибки, если я сам создаю SimpleRabbitListenerContainerFactory, все работает, я думаю, что его RabbitAnnotationDrivenConfiguration, который инициализирует вещи слишком рано   -  person Gary Russell    schedule 16.11.2019
comment
Я не понимаю как; автоконфигурация не будет пытаться подключиться; соединение не устанавливается до запуска контейнера (после завершения создания всех компонентов). Когда соединение создается, вызывается администратор для объявления. Переопределение фабрики контейнеров загрузки не имеет значения; так что что-то еще происходит. Ведение журнала DEBUG последовательности создания bean-компонента должно сказать все.   -  person Kalpesh Soni    schedule 16.11.2019
comment
поскольку я использую сервер конфигурации, контейнер запускается, а затем вызывается обновление, поэтому некоторые вещи происходят дважды, я очищу свой код и добавлю новые журналы   -  person Kalpesh Soni    schedule 20.11.2019


Ответы (2)


Это ясно показывает попытку подключения с помощью метода msgQueueBinding.

Следующие журналы показывают, что очередь / обмен / привязка успешно объявляются при запуске слушателя.

Я предполагаю, что ваши вызовы администратора происходят до того, как облачный код заменил определение bean-компонента фабрики соединений.

Спасибо за указатели Гэри

Это в основном конфиг, который "работает"

Если я отключу RabbitTemplate или Container Factory, я начну видеть ошибки

person Gary Russell    schedule 16.11.2019
comment
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton: 213] - Создание общего экземпляра одноэлементного компонента 'org.springframework.boot.actuate.autoconfigure.health.HealthIndicator'
mainConfigure ] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton: 213] - Создание общего экземпляра одноэлементного компонента 'management.health.status-org.springframework.boot.actuateties.autoconfigure.healthator' br> [main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.createArgumentArray: 777] - Автоматическое подключение по типу из имени bean-компонента 'org.springframework.boot.actuate.autoconfigure.framework.boot.actuate.autoconfigure.framework.boot.actuate.autoconfigure.framework.boot.actuate.autoconfigure.framework. bean с именем 'management.health.status-org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorProperties'
[главная] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSing Создание общего i Состояние одноэлементного bean-компонента 'healthIndicatorRegistry'
[главная] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.createArgumentArray: 777] - Автоматическое подключение по типу от имени bean-компонента 'healthIndicatorRegistry' через метод фабрики org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6483f5ae '
[основной] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeans.factory.support.DefaultListableBetonFactory совместно используемого экземпляра: singleServletanFactory.get кролик
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton: 213] - Создание общего экземпляра одноэлементного bean-компонента 'rabbitTemplate'
[main] [DEBUG] [org.springframew или beans.factory.support.DefaultListableBeanFactory.getSingleton: 213] - Создание общего экземпляра одноэлементного bean-компонента 'spring.rabbitmq-org.springframework.boot.autoconfigure.amqp.RabbitProperties'
[главная] [DEBUG] [org.springframework. beans.factory.support. DefaultListableBeanFactory.createArgumentArray: 777] - Автоматическое подключение по типу из имени bean-компонента 'org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration $ RabbitTemplateConfiguration' через конструктор к bean-компоненту с именем 'spring.rabbitmq-org.config.config.frame.
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton: 213] - Создание общего экземпляра одноэлементного bean-компонента 'rabbitConnectionFactory'
[main] [DEBUG] [org.springframework. beans.factory.support.DefaultListableBeanFactory.getSingleton: 213] - Создание совместно используемого экземпляра одноэлементного bean-компонента 'org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration $ RabbitConnectionFactoryCreator'
[main] [DEwork.spegans] [orgrame.spring. factory.support.DefaultListableBeanFactory.createArgumentArray: 777] - Автоматическое подключение по типу из bean-компонента rabbitConnectionFactory через фабричный метод к bean-компоненту с именем 'spring.rabbitmq-org.springframework.boot.autoconfigure.amqp.Ra bbitProperties »
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.createArgumentArray: 777] - Автоматическое подключение по типу из имени bean-компонента rabbitTemplate с помощью фабричного метода в bean-компонент с именем rabbitConnectionFactory.
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton: 213] - Создание общего экземпляра одноэлементного bean-компонента 'jsonMessageConverter'
[main] [DEBUG] [org.springframework.beans.factory .support.DefaultListableBeanFactory.getSingleton: 213] - Создание общего экземпляра одноэлементного bean-компонента rabbitMQConfig. - person Kalpesh Soni; 17.11.2019
comment
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.createArgumentArray: 777] - Автоматическое подключение по типу из bean-компонента viewResolver через фабричный метод к bean-компоненту с именем org.springframework.beans.factory. DefaultListableBeanFactory @ 1dde4cb2 '
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton: 213] - Создание общего экземпляра одноэлементного bean-компонента' amqpAdmin '
[main] [DEBUG] [main] [DEBUG] [main] [DEBUG] [main] [DEBUG] org.springframework.beans.factory.support.DefaultListableBeanFactory.createArgumentArray: 777] - Автоматическое подключение по типу из bean-компонента с именем amqpAdmin через фабричный метод к bean-компоненту с именем rabbitConnectionFactory
[главная] [DEBUG] [org.spring .factory.support.DefaultListableBeanFactory.getSingleton: 213] - Создание общего экземпляра одноэлементного bean-компонента 'org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration $ MessagingTemplateConfiguration'
[основной] [DEBUG] [orramework.spring.fctory. .support.DefaultListableBeanFac tory.getSingleton: 213] - Создание общего экземпляра одноэлементного bean-компонента 'rabbitMessagingTemplate'
[главная] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.createArgumentArray: 777] - Автоматическое связывание по типу из bean-компонента кролик .autoconfigure.amqp.RabbitAnnotationDrivenConfiguration '
[главная] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.createArgumentArray: 777] - Автоматическое подключение по типу из имени bean-компонента' org.framework .RabbitAnnotationDrivenConfiguration 'через конструктор в bean-компонент с именем' spring.rabbitmq-org.springframework.boot.autoconfigure.amqp.RabbitProperties '
[главная] [DEBUG] [org.springframework.beans.factory.supportBeletoningFrameworkListable : 213] - Создание общего экземпляра одноэлементного bean-компонента 'simpleRabbitListenerContainerFactoryConfigurer'
[главная] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton: 213] - Создание общего экземпляра одноэлементного bean-компонента 'rabbitLactory br> [main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.createArgumentArray: 777] - Автоматическое подключение по типу из имени bean-компонента 'rabbitListenerContainerFactory' с помощью фабричного метода в bean-компонент с именем 'mainRabbitrListener' [ContainerFactory]
[DEBUG] [org.springframework.beans.factory.support. DefaultListableBeanFactory.createArgumentArray: 777] - Автоматическое подключение по типу из bean-компонента rabbitListenerContainerFactory через фабричный метод к bean-компоненту с именем rabbitConnectionFactory. ] - Создание общего экземпляра одноэлементного bean-компонента 'directRabbitListenerContainerFactoryConfigurer' - person Gary Russell; 17.11.2019
comment
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton: 213] - Создание общего экземпляра singleton bean 'org.springframework.boot.actuate.autoconfigure.web.server.ConfagementContextAuto [main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton: 213] - Создание общего экземпляра одноэлементного bean-компонента 'management.server-org.springframework.boot.actuate.autoconfigure.web.server.Project '
[main] [DEBUG] [org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.:264] - предполагаемый тип аргумента для общедоступного void com.gm.gsmc.pricing.messenger.service.PricingMessageListener.handleMessage (com.gm.gsmc.pricing.domain.queue.QueueMessage) - это класс com.gm.gsmc.pricing.domain.queue.QueueMessage
[main] [DEBUG] [org.springframework.amqp.rabbit.listener. SimpleMessageListenerContainer.setConcurrentConsumers: 166] - Изменение потребителей с 1 на 5
[главная] [DEBUG] [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.start: 1293] - Запуск контейнера прослушивателя Rabbit.
[главная] [ИНФОРМАЦИЯ] [org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createBareConnection: 482] - Попытка подключиться к: [localhost: 5672]
[main] [INFO] [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.checkMismatchedQueues: 1713] - Брокер недоступен; невозможно принудительно объявить очередь во время запуска: java.net.ConnectException: соединение отклонено (соединение отклонено)
[org.springframework.amqp.rabbit.RabbitListenerEndpointContainer # 0-1] [INFO] [org.springframework.amqp.rabbit.connection .CachingConnectionFactory.createBareConnection: 482] - Попытка подключиться к: [localhost: 5672]
[org.springframework.amqp.rabbit.RabbitListenerEndpointContainer # 0-1] [ОШИБКА] [org.springframework.amqp.rabbit.listener. SimpleMessageListenerContainer.redeclareElementsIfNeeded: 1764] - Не удалось проверить / повторно объявить очереди с автоматическим удалением. java.net.ConnectException: соединение отклонено (соединение отклонено) \ n в java.net.PlainSocketImpl.socketConnect (собственный метод) ~ [na: 1.8.0_212] \ n в java.net.AbstractPlainSocketImpl.doConnect (AbstractPlainSocketImpl.java:350 ) ~ [na: 1.8.0_212] \ n в java.net.AbstractPlainSocketImpl.connectToAddress (AbstractPlainSocketImpl.java:206) ~ [na: 1.8.0_212] \ n в java.net.AbstractPlainSocketImpl.connect (AbstractPlainSocket188Impl.java ) ~ [na: 1.8.0_212] \ n в java.net.SocksSocketImpl.connect (SocksSocketImpl.java:392) ~ [na: 1. 8.0_212] \ n в java.net.Socket.connect (Socket.java:589) ~ [na: 1.8.0_212] \ n в com.rabbitmq.client.impl.SocketFrameHandlerFactory.create (SocketFrameHandlerFactory.java:60) ~ [amqp-client-5.4.3.jar! /: 5.4.3] \ n в com.rabbitmq.client.ConnectionFactory.newConnection (ConnectionFactory.java:1102) ~ [amqp-client-5.4.3.jar! /: 5.4.3] \ n в com.rabbitmq.client.ConnectionFactory.newConnection (ConnectionFactory.java:1054) ~ [amqp-client-5.4.3.jar! /: 5.4.3] \ n в org.springframework.amqp. rabbit.connection.AbstractConnectionFactory.createBareConnection (AbstractConnectionFactory.java:484) ~ [spring-rabbit-2.1.8.RELEASE.jar! /: 2.1.8.RELEASE] \ n ... 11 общих фреймов опущены \ nОткрыто: org .springframework.amqp.AmqpConnectException: java.net.ConnectException: соединение отклонено (соединение отклонено) \ n в org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException (RabbitExceptionTranslator.java. 8.RELEASE.jar! /: 2.1.8.RELEASE] \ n в org.springframewor k.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection (AbstractConnectionFactory.java:530) ~ [spring-rabbit-2.1.8.RELEASE.jar! /: 2.1.8.RELEASE] \ n в org.springframework.amqp.rabbit .connection.CachingConnectionFactory.createConnection (CachingConnectionFactory.java:702) ~ [spring-rabbit-2.1.8.RELEASE.jar! /: 2.1.8.RELEASE] \ n в org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils. createConnection (ConnectionFactoryUtils.java:214) ~ [spring-rabbit-2.1.8.RELEASE.jar! /: 2.1.8.RELEASE] \ n в org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute (RabbitTemplate.java : 2076) ~ [spring-rabbit-2.1.8.RELEASE.jar! /: 2.1.8.RELEASE] \ n в org.springframework.amqp.rabbit.core.RabbitTemplate.execute (RabbitTemplate.java:2050) ~ [ spring-rabbit-2.1.8.RELEASE.jar! /: 2.1.8.RELEASE] \ n в org.springframework.amqp.rabbit.core.RabbitTemplate.execute (RabbitTemplate.java:2030) ~ [spring-rabbit-2.1 .8.RELEASE.jar! /: 2.1.8.RELEASE] \ n в org.springframework.amqp.rabbit.core.RabbitAdmin.getQu eueProperties (RabbitAdmin.java:403) ~ [spring-rabbit-2.1.8.RELEASE.jar! /: 2.1.8.RELEASE] \ n в org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.attemptDeclarations (AbstractMessageListener : 1777) ~ [spring-rabbit-2.1.8.RELEASE.jar! /: 2.1.8.RELEASE] \ n в org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.redeclareElementsIfNeeded (AbstractMessageListenerContainer.java:17: spring-rabbit-2.1.8.RELEASE.jar! /:2.1.8.RELEASE ]\n в org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer $ AsyncMessageProcessingConsumer.initialize (SimpleMessageListenerContainer.java:1195) [spring-rabbit-2.1.8.RELEASE.jpg! /. 8.RELEASE] \ n в org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer $ AsyncMessageProcessingConsumer.run (SimpleMessageListenerContainer.java:1041) [spring-rabbit-2.1.8.RELEASE.jar! /: 2.1.8 \ n в java.lang.Thread.run (Thread.java:748) [na: 1.8.0_212] \ n - person Kalpesh Soni; 17.11.2019

Я взял код из RabbitAutoConfiguration и приложил все усилия, чтобы прочитать тот же yml и использовать свойства в bean-компонентах, которые я создаю.

Вам нужно показать свой @Configuration @EnableRabbit @Profile("cloud") @Slf4j public class RabbitMQConfig extends AbstractCloudConfig { final static String MAIN_QUEUE_NAME = "pricing"; private final static String QUEUE_EXCHANGE_NAME = "pricing-exchange"; private final static String DEAD_LETTER_QUEUE_NAME = "pricing-dl"; @Autowired RabbitProperties rabbitProperties; private void debug(String step) { CachingConnectionFactory connectionFactory = (CachingConnectionFactory) connectionFactory().rabbitConnectionFactory(); log.info("===> debug connection with {} {} ", step, connectionFactory.getClass().getName()); log.info("host {}", connectionFactory.getHost()); log.info("port {}", connectionFactory.getPort()); log.info("vh {}", connectionFactory.getVirtualHost()); log.info("user {}", connectionFactory.getUsername()); log.info("Auto recovery {}", connectionFactory.getRabbitConnectionFactory().isAutomaticRecoveryEnabled()); log.info("RabbitProperties {}", ToStringBuilder.reflectionToString(rabbitProperties)); } @SuppressWarnings("DuplicatedCode") @Bean public RabbitTemplate rabbitTemplate(MessageConverter messageConverter) { debug("rabbitTemplate"); RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory().rabbitConnectionFactory()); rabbitTemplate.setMessageConverter(messageConverter); if (rabbitProperties != null) { RabbitProperties.Template properties = this.rabbitProperties.getTemplate(); PropertyMapper map = PropertyMapper.get(); if (properties.getRetry().isEnabled()) { rabbitTemplate.setRetryTemplate(createRetryTemplate(properties.getRetry())); } map.from(properties::getReceiveTimeout).whenNonNull().as(Duration::toMillis) .to(rabbitTemplate::setReceiveTimeout); map.from(properties::getReplyTimeout).whenNonNull().as(Duration::toMillis).to(rabbitTemplate::setReplyTimeout); map.from(properties::getExchange).to(rabbitTemplate::setExchange); map.from(properties::getRoutingKey).to(rabbitTemplate::setRoutingKey); map.from(properties::getDefaultReceiveQueue).whenNonNull().to(rabbitTemplate::setDefaultReceiveQueue); } return rabbitTemplate; } private RetryTemplate createRetryTemplate(RabbitProperties.Retry properties) { PropertyMapper map = PropertyMapper.get(); RetryTemplate template = new RetryTemplate(); SimpleRetryPolicy policy = new SimpleRetryPolicy(); map.from(properties::getMaxAttempts).to(policy::setMaxAttempts); template.setRetryPolicy(policy); ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy(); map.from(properties::getInitialInterval).whenNonNull().as(Duration::toMillis) .to(backOffPolicy::setInitialInterval); map.from(properties::getMultiplier).to(backOffPolicy::setMultiplier); map.from(properties::getMaxInterval).whenNonNull().as(Duration::toMillis).to(backOffPolicy::setMaxInterval); template.setBackOffPolicy(backOffPolicy); return template; } @Bean public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() { debug("rabbit listener"); SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); factory.setConnectionFactory(connectionFactory().rabbitConnectionFactory()); factory.setMessageConverter(jsonMessageConverter()); factory.setAcknowledgeMode(AcknowledgeMode.AUTO); factory.setConcurrentConsumers(rabbitProperties.getListener().getSimple().getConcurrency()); factory.setMaxConcurrentConsumers(rabbitProperties.getListener().getSimple().getMaxConcurrency()); factory.setPrefetchCount(rabbitProperties.getListener().getSimple().getPrefetch()); factory.setMissingQueuesFatal(false); return factory; } @Bean public AmqpAdmin amqpAdmin() { ConnectionFactory connectionFactory = connectionFactory().rabbitConnectionFactory(); debug("amqpAdmin"); RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory); rabbitAdmin.initialize(); //This is what puts HA policy on the queue it seems Properties queueProperties = rabbitAdmin.getQueueProperties(MAIN_QUEUE_NAME); log.debug("queueProperties {}", queueProperties); return rabbitAdmin; } @PostConstruct public void init() { debug("postConstruct"); } @Bean("pricingQueue") @Primary public Queue pricingQueue() { return QueueBuilder.durable(MAIN_QUEUE_NAME) .withArgument("x-dead-letter-exchange", "") .withArgument("x-dead-letter-routing-key", DEAD_LETTER_QUEUE_NAME) .withArgument("x-queue-master-locator", "min-masters") .build(); } @Bean public Queue deadLetterQueue() { return QueueBuilder.durable(DEAD_LETTER_QUEUE_NAME) .withArgument("x-queue-master-locator", "min-masters") .build(); } @Bean public DirectExchange exchange() { return new DirectExchange(QUEUE_EXCHANGE_NAME); } @Bean public Binding pricingBinding(@Qualifier("pricingQueue") Queue pricingQueue, DirectExchange exchange) { return BindingBuilder.bind(pricingQueue).to(exchange).with(MAIN_QUEUE_NAME); } @Bean public DefaultMessageHandlerMethodFactory messageHandlerMethodFactory() { DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory(); factory.setMessageConverter(consumerJackson2MessageConverter()); return factory; } @Bean public MappingJackson2MessageConverter consumerJackson2MessageConverter() { return new MappingJackson2MessageConverter(); } @Bean public MessageConverter jsonMessageConverter() { return new Jackson2JsonMessageConverter(); } } (или _2_) и любую другую конфигурацию. Очевидно, у вас как-то есть две фабрики соединений, потому что объявления облачного брокера _3_ были успешными.

Я попробовал yml и сдался, у меня вообще нет свойств spring rabbitmq

Похоже, что объект RabbitProperties по умолчанию имеет localhost: 5672, и он используется фабрикой соединений до того, как конфигурация yml / cloud сможет подключиться к правильному материалу

    @Configuration
    @EnableRabbit
    @Profile("cloud")
    @Slf4j
    public class RabbitMQConfig extends AbstractCloudConfig {

    final static String MAIN_QUEUE_NAME = "pricing";
    private final static String QUEUE_EXCHANGE_NAME = "pricing-exchange";
    private final static String DEAD_LETTER_QUEUE_NAME = "pricing-dl";

    @Autowired
    RabbitProperties rabbitProperties;

    private void debug(String step) {
        CachingConnectionFactory connectionFactory = (CachingConnectionFactory) connectionFactory().rabbitConnectionFactory();
        log.info("===> debug connection with {} {} ", step, connectionFactory.getClass().getName());
        log.info("host {}", connectionFactory.getHost());
        log.info("port {}", connectionFactory.getPort());
        log.info("vh {}", connectionFactory.getVirtualHost());
        log.info("user {}", connectionFactory.getUsername());
        log.info("Auto recovery {}", connectionFactory.getRabbitConnectionFactory().isAutomaticRecoveryEnabled());
        log.info("RabbitProperties {}", ToStringBuilder.reflectionToString(rabbitProperties));
    }

    @SuppressWarnings("DuplicatedCode")
    @Bean
    public RabbitTemplate rabbitTemplate(MessageConverter messageConverter) {
        debug("rabbitTemplate");
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory().rabbitConnectionFactory());
        rabbitTemplate.setMessageConverter(messageConverter);
        if (rabbitProperties != null) {
            RabbitProperties.Template properties = this.rabbitProperties.getTemplate();
            PropertyMapper map = PropertyMapper.get();
            if (properties.getRetry().isEnabled()) {
                rabbitTemplate.setRetryTemplate(createRetryTemplate(properties.getRetry()));
            }
            map.from(properties::getReceiveTimeout).whenNonNull().as(Duration::toMillis)
                    .to(rabbitTemplate::setReceiveTimeout);
            map.from(properties::getReplyTimeout).whenNonNull().as(Duration::toMillis).to(rabbitTemplate::setReplyTimeout);
            map.from(properties::getExchange).to(rabbitTemplate::setExchange);
            map.from(properties::getRoutingKey).to(rabbitTemplate::setRoutingKey);
            map.from(properties::getDefaultReceiveQueue).whenNonNull().to(rabbitTemplate::setDefaultReceiveQueue);

        }
        return rabbitTemplate;
    }

    private RetryTemplate createRetryTemplate(RabbitProperties.Retry properties) {
        PropertyMapper map = PropertyMapper.get();
        RetryTemplate template = new RetryTemplate();
        SimpleRetryPolicy policy = new SimpleRetryPolicy();
        map.from(properties::getMaxAttempts).to(policy::setMaxAttempts);
        template.setRetryPolicy(policy);
        ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
        map.from(properties::getInitialInterval).whenNonNull().as(Duration::toMillis)
                .to(backOffPolicy::setInitialInterval);
        map.from(properties::getMultiplier).to(backOffPolicy::setMultiplier);
        map.from(properties::getMaxInterval).whenNonNull().as(Duration::toMillis).to(backOffPolicy::setMaxInterval);
        template.setBackOffPolicy(backOffPolicy);
        return template;
    }


    @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
        debug("rabbit listener");
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory().rabbitConnectionFactory());
        factory.setMessageConverter(jsonMessageConverter());
        factory.setAcknowledgeMode(AcknowledgeMode.AUTO);
        factory.setConcurrentConsumers(rabbitProperties.getListener().getSimple().getConcurrency());
        factory.setMaxConcurrentConsumers(rabbitProperties.getListener().getSimple().getMaxConcurrency());
        factory.setPrefetchCount(rabbitProperties.getListener().getSimple().getPrefetch());
        factory.setMissingQueuesFatal(false);
        return factory;
    }

    @Bean
    public AmqpAdmin amqpAdmin() {
        ConnectionFactory connectionFactory = connectionFactory().rabbitConnectionFactory();
        debug("amqpAdmin");

        RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
        rabbitAdmin.initialize();
        //This is what puts HA policy on the queue it seems
        Properties queueProperties = rabbitAdmin.getQueueProperties(MAIN_QUEUE_NAME);
        log.debug("queueProperties {}", queueProperties);
        return rabbitAdmin;
    }

    @PostConstruct
    public void init() {
        debug("postConstruct");
    }

    @Bean("pricingQueue")
    @Primary
    public Queue pricingQueue() {
        return QueueBuilder.durable(MAIN_QUEUE_NAME)
                .withArgument("x-dead-letter-exchange", "")
                .withArgument("x-dead-letter-routing-key", DEAD_LETTER_QUEUE_NAME)
                .withArgument("x-queue-master-locator", "min-masters")
                .build();
    }

    @Bean
    public Queue deadLetterQueue() {
        return QueueBuilder.durable(DEAD_LETTER_QUEUE_NAME)
                .withArgument("x-queue-master-locator", "min-masters")
                .build();
    }

    @Bean
    public DirectExchange exchange() {
        return new DirectExchange(QUEUE_EXCHANGE_NAME);
    }

    @Bean
    public Binding pricingBinding(@Qualifier("pricingQueue") Queue pricingQueue,
                                  DirectExchange exchange) {
        return BindingBuilder.bind(pricingQueue).to(exchange).with(MAIN_QUEUE_NAME);
    }

    @Bean
    public DefaultMessageHandlerMethodFactory messageHandlerMethodFactory() {
        DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
        factory.setMessageConverter(consumerJackson2MessageConverter());
        return factory;
    }

    @Bean
    public MappingJackson2MessageConverter consumerJackson2MessageConverter() {
        return new MappingJackson2MessageConverter();
    }

    @Bean
    public MessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}
person Kalpesh Soni    schedule 20.11.2019