Существует множество примеров, когда 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: соединение отклонено (соединение отклонено)