Concurrency spring rabbitmq中每个队列的动态容器创建

Concurrency spring rabbitmq中每个队列的动态容器创建,concurrency,rabbitmq,spring-amqp,spring-rabbit,Concurrency,Rabbitmq,Spring Amqp,Spring Rabbit,我的应用程序有多个队列(队列名称将取自数据库),每个队列每天都会消耗大量数据。 为此,我需要为每个队列创建一个容器和消息侦听器,以便每个队列都有一个单独的线程。除此之外,还可以动态创建一些队列,我需要为新创建的队列分配一个容器 我的消费类课程开始如下 //下面是我开始上课的方式 @组件 公共类RequestConsumer实现MessageListener{``` //下面是我创建MessageListner的代码 @豆子 @范围(value=“原型”) 公共SimpleMessageListe

我的应用程序有多个队列(队列名称将取自数据库),每个队列每天都会消耗大量数据。 为此,我需要为每个队列创建一个容器和消息侦听器,以便每个队列都有一个单独的线程。除此之外,还可以动态创建一些队列,我需要为新创建的队列分配一个容器

我的消费类课程开始如下

//下面是我开始上课的方式

@组件
公共类RequestConsumer实现MessageListener{```
//下面是我创建MessageListner的代码
@豆子
@范围(value=“原型”)
公共SimpleMessageListenerContainer simpleMessageListenerNotification(
连接工厂(连接工厂){
SimpleMessageListenerContainer SimpleMessageListenerContainer=
新SimpleMessageListenerContainer(连接工厂);
RabbitAdmin RabbitAdmin=getRabbitAdmin(connectionFactory);
RequestConsumer=(RequestConsumer)beanFactory.getBean(“RequestConsumer”);
simpleMessageListenerContainer.setupMessageListener(RequestConsumer);
simpleMessageListenerContainer.setAutoDeclare(true);
for(字符串queueName:requestConsumerQueueList()){
队列=新队列(队列名称);
rabbitAdmin.declareQueue(队列);
simpleMessageListenerContainer.addQueues(队列);
}
simpleMessageListenerContainer.start();
返回simpleMessageListenerContainer;
}

我当前的代码只为所有队列创建了一个容器,其中包含一个messageListner,而我希望每个队列都有单独的容器。

首先,您不应该在bean定义中声明队列-这在上下文的生命周期中为时过早

您也不应该在bean定义中调用
start()

你应该这样做:

@springboot应用程序
公共类SO56951298应用程序{
公共静态void main(字符串[]args){
SpringApplication.run(So56951298Application.class,args);
}
@豆子
公共声明队列(){
返回新的声明项(Arrays.asList(新队列(“q1”)、新队列(“q2”));
}
@豆子
@范围(可配置BeanFactory.Scope\u原型)
公共SimpleMessageListenerContainer容器(ConnectionFactory ConnectionFactory,
排队(排队){
SimpleMessageListenerContainer容器=新的SimpleMessageListenerContainer(connectionFactory);
container.setQueues(队列);
container.setMessageListener(msg->System.out.println(msg));
返回容器;
}
@豆子
公共应用程序运行程序运行程序(ConnectionFactory、ConnectionFactory、可声明项队列){
返回参数->{
queues.getDeclarables().forEach(dec->container(connectionFactory,(Queue)dec.start());
};
}
}

框架将在正确的时间自动声明队列(只要应用程序上下文中存在
RabbitAdmin
(Spring Boot自动配置)。

首先,您不应该在bean定义中声明队列-在上下文的生命周期中还为时过早

您也不应该在bean定义中调用
start()

你应该这样做:

@springboot应用程序
公共类SO56951298应用程序{
公共静态void main(字符串[]args){
SpringApplication.run(So56951298Application.class,args);
}
@豆子
公共声明队列(){
返回新的声明项(Arrays.asList(新队列(“q1”)、新队列(“q2”));
}
@豆子
@范围(可配置BeanFactory.Scope\u原型)
公共SimpleMessageListenerContainer容器(ConnectionFactory ConnectionFactory,
排队(排队){
SimpleMessageListenerContainer容器=新的SimpleMessageListenerContainer(connectionFactory);
container.setQueues(队列);
container.setMessageListener(msg->System.out.println(msg));
返回容器;
}
@豆子
公共应用程序运行程序运行程序(ConnectionFactory、ConnectionFactory、可声明项队列){
返回参数->{
queues.getDeclarables().forEach(dec->container(connectionFactory,(Queue)dec.start());
};
}
}
框架将在正确的时间自动声明队列(只要应用程序上下文中存在
RabbitAdmin
(Spring Boot自动配置)