【问题标题】:How to use multiple vhosts in a Spring RabbitMQ project?如何在 Spring RabbitMQ 项目中使用多个虚拟主机?
【发布时间】:2020-06-18 09:01:59
【问题描述】:

我有以下两个 Configuration 类:

@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 中),所有 Exchange 均在 both VHosts 中创建。

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

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

【问题讨论】:

  • 您是否介意分享配置类的完整代码。我正在尝试实现这样一个场景,我有两个虚拟主机并且我被卡住了。
  • @martinkimani 抱歉,我无法再访问代码了...

标签: java spring rabbitmq-exchange spring-rabbit


【解决方案1】:

conditional declaration

具体来说:

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

【讨论】:

  • 我也刚找到这个,但不敢这么快回答我的问题...不过无论如何,非常感谢!
【解决方案2】:

我们可以使用 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 repo 来展示如何做到这一点:spring-boot-amqp-multiple-vhosts

【讨论】:

    猜你喜欢
    • 2015-01-30
    • 2017-03-06
    • 1970-01-01
    • 2021-05-23
    • 2015-12-03
    • 1970-01-01
    • 2019-02-25
    • 2021-08-15
    • 2022-07-12
    相关资源
    最近更新 更多