#spring-boot #rabbitmq
#пружинный ботинок #кролик
Вопрос:
У меня есть приложение для загрузки spring с издателем, которое публикует сообщения для обмена сообщениями. Это прекрасно работает. Однако потребитель должен читать с другого разветвленного обмена. Проблема в том, что ConnectionFactory, похоже, получает настройки из конфигурации publsher. Конфигурации находятся в двух разных файлах @Configuration.
Похоже, что @RabbitListener не принимает ConsumerConfig.BINANCE_QUEUE
BINANCE_EXCHANGE И ОЧЕРЕДЬ не считываются.
@Configuration public class ConsumerConfig { public static final String BINANCE_EXCHANGE = "binance_exchange"; public static final String BINANCE_QUEUE = "binance_data"; public static final String ROUTING = "index_data"; @Bean public Queue consumerQueue() { return new Queue(BINANCE_QUEUE, true, false, false); } @Bean public FanoutExchange consumerExchange() { return new FanoutExchange(BINANCE_EXCHANGE); } @Bean public Binding consumerBinding(Queue queue, FanoutExchange exchange) { System.out.println(queue.toString()); return BindingBuilder.bind(queue).to(exchange); } @Bean public MessageConverter consumerConverter() { return new Jackson2JsonMessageConverter(); } @Bean public AmqpTemplate consumerTemplate(ConnectionFactory connectionFactory) { final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); rabbitTemplate.setMessageConverter(consumerConverter()); return rabbitTemplate; } }
Приведенная ниже конфигурация используется как издателем, так и подписчиком.
@Configuration public class PublisherConfig { public static final String EXCHANGE = "CRYPTO_AGGREGATES"; public static final String QUEUE = "crypto_aggregates"; //public static final String ROUTING = "test_routing"; @Bean public Queue queue() { return new Queue(QUEUE, true, false, false); } @Bean public FanoutExchange exchange() { return new FanoutExchange(EXCHANGE); } @Bean public Binding binding(Queue queue, FanoutExchange exchange) { Binding binding= BindingBuilder.bind(queue).to(exchange); return binding; } @Bean public MessageConverter converter() { return new Jackson2JsonMessageConverter(); } @Bean public AmqpTemplate template(ConnectionFactory connectionFactory) { final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); rabbitTemplate.setMessageConverter(converter()); return rabbitTemplate; } }
Потребитель сообщений
@Component public class Consumer { private final StreamingCryptoReader streamingCryptoReader; @Autowired public Consumer(StreamingCryptoReader streamingCryptoReader) { this.streamingCryptoReader = streamingCryptoReader; } @RabbitListener(queues = ConsumerConfig.BINANCE_QUEUE) public void consumeMessageFromQueue(BinanceTradeHistorySend history) { System.out.println("Last item consumed Binance trades: " history.toString()); try { streamingCryptoReader.addToList(history); } catch (Exception e) { System.out.println(e.getMessage()); } } }
Комментарии:
1. Spring использует одноэлементный шаблон, поэтому вам придется предоставить соединение для каждого экземпляра rabbitmq и использовать @Квалификатор для указания имени экземпляра, который вы хотите автоматически подключить к своему потребителю и издателю