SpringRabbitMQ-为每个连接缓存多个通道?

k10s72fa  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(343)

使用springamqp的默认缓存策略是创建具有多个通道的单个连接。创建的通道数取决于侦听器的并发性。
这给我们带来了一个问题,因为我们有很多监听器,而只有少数消费者并发。rabbit文档建议每个连接使用一位数的通道数。
当我们有几个侦听器时,假设10个,每个侦听器需要5个并发。这将创建一个具有50个通道的单一连接,这远远超出了建议的数量。
我试过和你玩 spring.rabbitmq.cache 属性,但我不知道如何设置它,使每个侦听器都使用自己的5个通道的连接。我更喜欢用5个频道创建10个连接,而不是用50个频道创建1个连接。
有人能给我指出正确的方向吗?

vybvopom

vybvopom1#

最简单的解决方案是为每个容器提供自己的连接工厂。
您可以添加 ContainerCustomizer 到容器工厂,并使用它更改每个容器的连接工厂。它将在容器创建之后和启动之前被调用。
编辑

@SpringBootApplication
public class So64913992Application {

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

    @RabbitListener(queues = "foo", concurrency = "5")
    public void listen1(String in) {
        System.out.println(in);
    }

    @RabbitListener(queues = "bar", concurrency = "5")
    public void listen2(String in) {
        System.out.println(in);
    }

}

@Component
class Customizer {

    Customizer(GenericApplicationContext context, CachingConnectionFactory cf,
            SimpleRabbitListenerContainerFactory factory) {

        factory.setContainerCustomizer(container -> {
            CachingConnectionFactory newCf = new CachingConnectionFactory(cf.getRabbitConnectionFactory());
            String name = "cf." + container.getQueueNames()[0];
            newCf.setConnectionNameStrategy(c -> name);
            // set any other CCF properties you need
            context.registerBean(name, CachingConnectionFactory.class, () -> newCf);
            context.getBean(name); // initialize
            container.setConnectionFactory(newCf);
        });
    }

}

相关问题