【问题标题】:Is there any way to limit the channels created by the producer?有没有办法限制生产者创建的频道?
【发布时间】:2021-12-10 11:03:29
【问题描述】:

我们的应用程序可以非常快速地生成消息并需要 ACK。

这是一个愚蠢的模拟:

    @Bean
    public CachingConnectionFactory ccf() {
        var ccf = new CachingConnectionFactory("localhost");
        ccf.setPublisherConfirmType(CORRELATED);
        ccf.setPublisherReturns(true);
        return ccf;
    }


    @Bean
    public ApplicationRunner run(RabbitTemplate template) {
        return args -> {
            for (int i = 1; i < 10001; i++) {
                template.convertAndSend("poc", "hey");
                if (i % 1000 == 0) {
                    LOG.info("{}", i);
            }   }
        };
    }

这段代码最终会创建和销毁多个频道,有没有办法限制将要同时创建的频道? (阻塞或入队)

这是在兔子控制台中保持缓存的通道之一:127.0.0.1:54190 (509)。

【问题讨论】:

    标签: spring-amqp spring-rabbit


    【解决方案1】:

    setChannelCheckoutTimeout

        /**
         * Sets the channel checkout timeout. When greater than 0, enables channel limiting
         * in that the {@link #channelCacheSize} becomes the total number of available channels per
         * connection rather than a simple cache size. Note that changing the {@link #channelCacheSize}
         * does not affect the limit on existing connection(s), invoke {@link #destroy()} to cause a
         * new connection to be created with the new limit.
         * <p>
         * Since 1.5.5, also applies to getting a connection when the cache mode is CONNECTION.
         * @param channelCheckoutTimeout the timeout in milliseconds; default 0 (channel limiting not enabled).
         * @since 1.4.2
         * @see #setConnectionLimit(int)
         */
        public void setChannelCheckoutTimeout(long channelCheckoutTimeout) {
    

    编辑

    这按预期工作......

    spring.rabbitmq.cache.channel.size=2
    spring.rabbitmq.cache.channel.checkout-timeout=1s
    spring.rabbitmq.publisher-confirm-type=correlated
    spring.rabbitmq.publisher-returns=true
    
    @SpringBootApplication
    public class So69699961Application {
    
        public static void main(String[] args) {
            SpringApplication.run(So69699961Application.class, args).close();
        }
    
        @Bean
        ApplicationRunner runner(CachingConnectionFactory cf) {
            return args -> {
                Connection conn = cf.createConnection();
                Channel chann1 = conn.createChannel(false);
                Channel chann2 = conn.createChannel(false);
                try {
                    Channel chann3 = conn.createChannel(false);
                }
                catch (Exception e) {
                    e.printStackTrace();
                }
                chann2.close();
                chann1.close();
                conn.close();
            };
        }
    
    }
    
    org.springframework.amqp.AmqpTimeoutException: No available channels
    

    【讨论】:

    • 太棒了!非常感谢!
    • 我仍在创建比配置数量更多的频道,远远少于没有给定配置的频道。这可能吗?
    • 我不知道如何 - 请参阅我的答案的编辑。
    • 我也不明白。我将在您的回购问题中发布我的实际代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    相关资源
    最近更新 更多