Как использовать несколько виртуальных хостов в проекте Spring RabbitMQ?

Имеются следующие два класса конфигурации:

@Configuration
@EnableRabbit
@Import({ LocalRabbitConfigA.class, CloudRabbitConfigA.class })
public class RabbitConfigA {
    @Autowired
    @Qualifier("rabbitConnectionFactory_A")
    private ConnectionFactory rabbitConnectionFactory;

    @Bean(name = "admin_A")
    AmqpAdmin amqpAdmin() {
        return new RabbitAdmin(rabbitConnectionFactory);
    }

    @Bean(name = "Exchange_A")
    DirectExchange receiverExchange() {
        return new DirectExchange("Exchange_A", true, false);
    }
}

И

@Configuration
@EnableRabbit
@Import({ LocalRabbitConfigB.class, CloudRabbitConfigB.class })
public class RabbitConfigB {
    @Autowired
    @Qualifier("rabbitConnectionFactory_B")
    private ConnectionFactory rabbitConnectionFactory;

    @Bean(name = "admin_B")
    AmqpAdmin amqpAdmin() {
        return new RabbitAdmin(rabbitConnectionFactory);
    }

    @Bean(name = "Exchange_B")
    DirectExchange receiverExchange() {
        return new DirectExchange("Exchange_B", true, false);
    }
}

Обратите внимание, что классы LocalRabbitConfigA и LocalRabbitConfigB определяют connectionFactory, который подключается к другому VHost.
При запуске приложения (в Tomcat) все биржи создаются в обоих VHosts.

Вопрос в том, как определить, что определенный Exchange / Queue создается определенной ConnectionFactiory?

Так что VHost A содержит только Exchange_A, а VHost B только Exchange_B?


person Stef Heyenrath    schedule 08.10.2016    source источник
comment
не могли бы вы поделиться полным кодом классов конфигурации. Я пытаюсь реализовать такой сценарий, когда у меня есть два vhosts, и я застрял.   -  person martin kimani    schedule 16.07.2018
comment
@martinkimani Извините, я больше не могу получить доступ к коду ...   -  person Stef Heyenrath    schedule 16.07.2018


Ответы (2)


См. условное объявление.

Конкретно:

@Bean(name = "Exchange_B")
DirectExchange receiverExchange() {
    DirectExchange exchange = new DirectExchange("Exchange_B", true, false);
    exchange.setAdminsThatShouldDeclare(amqpAdmin());
    return exchange;
}
person Gary Russell    schedule 08.10.2016
comment
Я это тоже только что нашла, но не решилась так быстро ответить на свой вопрос ... Но все равно большое спасибо! - person Stef Heyenrath; 08.10.2016

Мы можем добиться этого с помощью SimpleRoutingConnectionFactory, где мы создаем несколько фабрик соединений для каждого виртуального хоста и настраиваем его на SimpleRoutingConnectionFactory.

Из документации Spring: весенний документ

public class MyService {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void service(String vHost, String payload) {
        SimpleResourceHolder.bind(rabbitTemplate.getConnectionFactory(), vHost);
        rabbitTemplate.convertAndSend(payload);
        SimpleResourceHolder.unbind(rabbitTemplate.getConnectionFactory());
    }

}

Я создал репозиторий git, показывающий, как это сделать: spring-boot-amqp- несколько vhosts

person Lyju I Edwinson    schedule 18.06.2020