如何在SpringBoot 2.7.15中实现ConnectionFactory#setMaxInboundMessageBodySize?

How to implement ConnectionFactory#setMaxInboundMessageBodySize in SpringBoot 2.7.15?

提问人:BlueIce 提问时间:11/17/2023 更新时间:11/17/2023 访问量:17

问:

我正在尝试增加 inbonund amqp 消息的正文大小限制。

我有一个 Cloud-Foundry Springboot 2.7.15 应用程序。

我的类目前如下所示:

@Configuration
public class RabbitConfig {

    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public ConnectionFactoryCustomizer customizer() {
        return connectionFactory -> connectionFactory.setMaxInboundMessageBodySize(1024 * 1024 * 100);
    }

}

调试时,我可以看到在执行 customizer-bean 后,返回的工厂(具有 rabbitConnectionFactory)确实正确设置了 maxInboundMessageBodySize 值 (1024 * 1024 * 100)。

picture of maxInboundMessageBodySize-var being set correctly

但是,当将应用程序部署到CloudFoundry并尝试处理队列中的消息时,我仍然收到错误消息:

j.l.IllegalStateException: Message body is too large (71506699), maximum configured size is 67108864. See ConnectionFactory#setMaxInboundMessageBodySize if you need to increase the limit.\n\tat c.r.c.i.CommandAssembler.consumeHeaderFrame(CommandAssembler.java:109)\n\tat c.r.c.i.CommandAssembler.handleFrame(CommandAssembler.java:172)\n\tat c.r.c.i.AMQCommand.handleFrame(AMQCommand.java:105)\n\tat c.r.c.i.AMQChannel.handleFrame(AMQChannel.java:115)\n\tat c.r.c.i.AMQConnection.readFrame(AMQConnection.java:746)\n\tat c.r.c.i.AMQConnection.access$300(AMQConnection.java:47)\n\tat c.r.c.i.AMQConnection$MainLoop.run(AMQConnection.java:673)\n\tat java.lang.Thread.run(Unknown Source)\n","message":"An unexpected connection driver error occurred"}

不知何故,原始值仍在使用。

我已经检查了是否只创建了一个 ConnectionFactory - 从 RabbitAutoConfiguration.class 返回的那个。

我也尝试升级到Springboot 3.1.5。但是没有运气 - 同样的错误仍然存在。

我已经看到了下面的帖子并尝试了建议的修复程序,但没有运气: 带有 RabbitMQ binder 的 Spring cloud stream 抛出 java.lang.IllegalStateException:消息体太大

任何帮助都是值得赞赏的。

Spring spring-Boot Cloud-Foundry 弹簧-AMQP

评论


答:

0赞 Anvar Bratov 11/30/2023 #1
@Bean
public CachingConnectionFactory smtConnectionFactory() {
    RabbitConnectionProperties.Connection connectionParams = rabbitConnectionProperties.getSmt();
    CachingConnectionFactory connectionFactory = new CachingConnectionFactory(connectionParams.getHost());
    connectionFactory.setPort(connectionParams.getPort());
    connectionFactory.setVirtualHost(connectionParams.getVirtualHost());
    connectionFactory.setUsername(connectionParams.getUsername());
    connectionFactory.setPassword(connectionParams.getPassword());
    connectionFactory.getRabbitConnectionFactory().setMaxInboundMessageBodySize(1024*1024*100);
    return connectionFactory;
}