每个队列在spring-rabbitmq中动态创建容器

时间:2019-07-09 11:12:46

标签: concurrency rabbitmq spring-amqp spring-rabbitmq

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

“我的消费者”课程的开始方式如下

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

@Component
public class RequestConsumer implements MessageListener {```
//and below is the code by which I am creating Message listner
@Bean
    @Scope(value = "prototype")
    public SimpleMessageListenerContainer simpleMessageListenerNotification(
            ConnectionFactory connectionFactory) {
        SimpleMessageListenerContainer simpleMessageListenerContainer =
                new SimpleMessageListenerContainer(connectionFactory);
        RabbitAdmin rabbitAdmin = getRabbitAdmin(connectionFactory);
        RequestConsumer RequestConsumer = (RequestConsumer) beanFactory.getBean("requestConsumer");
        simpleMessageListenerContainer.setupMessageListener(RequestConsumer);
        simpleMessageListenerContainer.setAutoDeclare(true);
        for (String queueName : requestConsumerQueueList()) {
            Queue queue = new Queue(queueName);
            rabbitAdmin.declareQueue(queue);
            simpleMessageListenerContainer.addQueues(queue);
        }
        simpleMessageListenerContainer.start();
        return simpleMessageListenerContainer;
    }

我当前的代码是为所有队列仅创建一个带有messageListner的容器,而我期望为每个队列使用单独的容器。

1 个答案:

答案 0 :(得分:0)

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

您也不应该再在bean定义中调用start()-太早了。

您应该执行以下操作:

@SpringBootApplication
public class So56951298Application {

    public static void main(String[] args) {
        SpringApplication.run(So56951298Application.class, args);
    }

    @Bean
    public Declarables queues() {
        return new Declarables(Arrays.asList(new Queue("q1"), new Queue("q2")));
    }

    @Bean
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
            Queue queue) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
        container.setQueues(queue);
        container.setMessageListener(msg -> System.out.println(msg));
        return container;
    }

    @Bean
    public ApplicationRunner runner(ConnectionFactory connectionFactory, Declarables queues) {
        return args -> {
            queues.getDeclarables().forEach(dec -> container(connectionFactory, (Queue) dec).start());
        };
    }

}

只要应用程序上下文中有RabbitAdmin(Spring Boot自动配置该上下文),框架就会在适当的时间自动声明队列。