如何在 Spring RabbitMQ 项目中使用多个虚拟主机?

How to use multiple vhosts in a Spring RabbitMQ project?

我有以下两个配置类:

@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 类 定义了连接到不同 VHost 的 connectionFactory。
启动应用程序时(在 Tomcat 内),所有交换都在 both VHosts 中创建。

问题是如何定义某个 Exchange/Queue 是由特定的 ConnectionFactiory 创建的?

所以 VHost A 只包含 Exchange_A,而 VHost B 只包含 Exchange_B ?

conditional declaration

具体来说:

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

我们可以使用 SimpleRoutingConnectionFactory 实现这一点,我们在其中为虚拟主机创建多个连接工厂,并将其配置为 SimpleRoutingConnectionFactory。

来自 spring 文档:spring doc

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-multiple-vhosts