如何在 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 ?
具体来说:
@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
我有以下两个配置类:
@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 ?
具体来说:
@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