首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Spring Boot中创建rabbitmq队列,但不使用@Bean

如何在Spring Boot中创建rabbitmq队列,但不使用@Bean
EN

Stack Overflow用户
提问于 2021-10-30 03:45:00
回答 2查看 240关注 0票数 0

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

代码语言:javascript
运行
复制
@Bean
public Queue productQueue(final String queueName) {
    return new Queue(queueName);
} 

但是使用不带@Bean的相同代码

代码语言:javascript
运行
复制
public Queue productQueue(final String queueName) {
    return new Queue(queueName);
}

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

代码语言:javascript
运行
复制
Queue queue = <Object>.productQueue("product-queue");
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-03 12:03:39

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

代码语言:javascript
运行
复制
@Autowired
private ConnectionFactory connectionFactory;

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

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

代码语言:javascript
运行
复制
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);
  
  }
}
票数 2
EN

Stack Overflow用户

发布于 2021-10-30 09:12:55

Queue对象必须是上下文中的bean,并且由Spring管理。要在运行时动态创建队列,请使用作用域prototype定义bean

代码语言:javascript
运行
复制
@Bean
@Scope("prototype")
public Queue productQueue(final String queueName) {
    return new Queue(queueName);
} 

并在运行时使用ObjectProvider创建队列

代码语言:javascript
运行
复制
@Autowired
private ObjectProvider<Queue> queueProvider;

Queue queue1 = queueProvider.getObject("queueName1");
Queue queue2 = queueProvider.getObject("queueName2");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69776621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档