如何在 Spring 启动但不使用 @Bean 的情况下创建 rabbitmq 队列

How to create a rabbitmq Queue in Spring Boot but without using @Bean

在我的场景中,我需要在 运行 时间动态创建大量队列,这就是为什么我不想使用 @Bean 而是想编写一个创建队列的函数,我将调用它必要时。 在这里,当我使用 @bean 注释时,它会在 rabbitmq 服务器上创建队列。

@Bean
public Queue productQueue(final String queueName) {
    return new Queue(queueName);
} 

但使用没有@Bean 的相同代码

public Queue productQueue(final String queueName) {
    return new Queue(queueName);
}

调用此函数时不会在 rabbitmq 服务器上创建队列

Queue queue = <Object>.productQueue("product-queue");

Queue 对象必须是上下文中的 bean 并由 Spring 管理。要在运行时动态创建队列,定义范围为 prototype:

的 bean
@Bean
@Scope("prototype")
public Queue productQueue(final String queueName) {
    return new Queue(queueName);
} 

并在运行时使用 ObjectProvider:

创建队列
@Autowired
private ObjectProvider<Queue> queueProvider;

Queue queue1 = queueProvider.getObject("queueName1");
Queue queue2 = queueProvider.getObject("queueName2");

为了动态创建 rabbitmq 队列,我使用了以下方法,如果您还想创建交换并绑定到队列,这是最好的方法。

@Autowired
private ConnectionFactory connectionFactory;

@Bean
public AmqpAdmin amqpAdmin() {
 return new RabbitAdmin(connectionFactory);
}

现在您可以定义一个 class 来创建队列、交换和绑定它们

public class rabbitHelper {
  @Autowired
  private RabbitAdmin rabbitAdmin;
  
  public Queue createQueue(String queueName) {
    Queue q  = new Queue(queueName);
    rabbitAdmin.declareQueue(q);
    return q;
  }
 
 public Exchange createExchange(String exchangeName) {
    Exchange exchange  = new DirectExchange(exchangeName);
    rabbitAdmin.declareExchange(exchange);
    return exchange;
  }

public void createBinding(String queueName, String exchangeName, String routingKey) {
    Binding binding = new Binding(queueName, Binding.DestinationType.QUEUE, queueName, routingKey, null);
        rabbitAdmin().declareBinding(binding);
  
  }
}