如何在 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);
}
}
在我的场景中,我需要在 运行 时间动态创建大量队列,这就是为什么我不想使用 @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
@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);
}
}