【问题标题】:dynamic container creation in spring-rabbitmq per queue每个队列在 spring-rabbitmq 中动态创建容器
【发布时间】:2019-07-09 11:12:46
【问题描述】:

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

我的 Consumer 课程开始如下所示

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

@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 的容器,而我希望每个队列都有单独的容器。

【问题讨论】:

    标签: concurrency rabbitmq spring-amqp spring-rabbit


    【解决方案1】:

    首先,您不应该在 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会自动配置)。

    【讨论】:

      猜你喜欢
      • 2015-06-16
      • 2014-02-11
      • 1970-01-01
      • 2017-07-30
      • 1970-01-01
      • 2013-04-28
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多