RocketMQ4.2.0-参数配置解析-Producer配置-compressMsgBodyOverHowmuch

本文详细介绍了RocketMQ中消息Body的压缩机制,包括压缩条件、压缩方法及其实现原理。通过对源码的分析,展示了如何根据消息大小进行压缩,并解释了压缩过程中使用的Deflater类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参数解析系列不会写太多,看到哪儿写到哪儿

根据RocketMQ3.2.4的开发手册定义,compressMsgBodyOverHowmuch 是指 “消息 Body 超过多大开始压缩(Consumer
收到消息会自动解压缩),单位字节”,默认是1024*4即4096

此参数在 FiltersrvConfig.java和DefaultMQProducer.java 中均有定义

前者是DefaultRequestProcessor.java调用 FiltersrvController时使用,后者是 DefaultMQProducerImpl.java使用。

DefaultMQProducerImpl.java

//org.apache.rocketmq.filtersrv.processor.DefaultRequestProcessor.java
    private ByteBuffer messageToByteBuffer(final MessageExt msg) throws IOException {
        int sysFlag = MessageSysFlag.clearCompressedFlag(msg.getSysFlag());
        if (msg.getBody() != null) {
            if (msg.getBody().length >= this.filtersrvController.getFiltersrvConfig().getCompressMsgBodyOverHowmuch()) {
                byte[] data = UtilAll.compress(msg.getBody(), this.filtersrvController.getFiltersrvConfig().getZipCompressLevel());
                if (data != null) {
                    msg.setBody(data);
                    sysFlag |= MessageSysFlag.COMPRESSED_FLAG;
                }
            }
        }
//此方法还有代码未写完 略。。。
}

DefaultMQProducerImpl.java的调用

//org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.java
    private boolean tryToCompressMessage(final Message msg) {
        if (msg instanceof MessageBatch) {
            //batch dose not support compressing right now
            return false;
        }
        byte[] body = msg.getBody();
        if (body != null) {
            if (body.length >= this.defaultMQProducer.getCompressMsgBodyOverHowmuch()) {
                try {
                    byte[] data = UtilAll.compress(body, zipCompressLevel);
                    if (data != null) {
                        msg.setBody(data);
                        return true;
                    }
                } catch (IOException e) {
                    log.error("tryToCompressMessage exception", e);
                    log.warn(msg.toString());
                }
            }
        }

        return false;
    }

由上可知 完成压缩消息的是 
UtilAll.compress(final byte[] src, final int level) 
方法
再看其定义
//org.apache.rocketmq.common.UtilAll.java
 public static byte[] compress(final byte[] src, final int level) throws IOException {
        byte[] result = src;
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(src.length);
        java.util.zip.Deflater defeater = new java.util.zip.Deflater(level);
        DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(byteArrayOutputStream, defeater);
        try {
            deflaterOutputStream.write(src);
            deflaterOutputStream.finish();
            deflaterOutputStream.close();
            result = byteArrayOutputStream.toByteArray();
        } catch (IOException e) {
            defeater.end();
            throw e;
        } finally {
            try {
                byteArrayOutputStream.close();
            } catch (IOException ignored) {
            }

            defeater.end();
        }

        return result;
    }
此处默认level=5(在FiltersrvConfig.java中有定义

综上所述,当配置参数compressMsgBodyOverHowmuch后,RocketMQ按照规则判定消息body大小时,使用 jdk自带的java.util.zip.Deflater 对body进行压缩处理。


### 启动 RocketMQ 4.2.0 版本中的 `rocketmq-externals` 组件 #### 准备工作 为了在 Windows 上启动 RocketMQ 的 `rocketmq-externals` 组件,需先完成基本环境配置。确保已安装 Java 开发工具包 (JDK),并设置好 JAVA_HOME 环境变量。 #### 解压缩文件 将下载好的 RocketMQ 发行版 ZIP 文件解压至指定目录。例如,在命令提示符中执行以下操作[^2]: ```shell unzip rocketmq-all-4.2.0-bin-release.zip -d C:\RocketMQ\ ``` #### 配置环境变量 为方便后续操作,建议添加 ROCKETMQ_HOME 环境变量指向解压后的主目录,并更新 PATH 变量以包含 `%ROCKETMQ_HOME%\bin` 路径。 #### 启动 NameServer 和 Broker 依次运行下列批处理脚本来启动 Name Server 和 Broker 实例: ```batchfile rem 启动NameServer start %ROCKETMQ_HOME%\bin\mqnamesrv.cmd rem 启动Broker,默认监听10911端口 start %ROCKETMQ_HOME%\bin\mqbroker.cmd -n localhost:9876 autoCreateTopicEnable=true ``` #### 运行 Web 控制台 对于 `rocketmq-externals` 中的控制台部分,进入其所在子目录后可直接通过 Maven 或内置的 Spring Boot 应用来启动服务[^5]。假设已经位于该模块根目录,则可以尝试如下方式来启动: ```batchfile cd D:\RocketMQ\rocketmq-externals-release-rocketmq-console-1.0.0\rocketmq-console mvnw spring-boot:run ``` 注意这里使用的是 mvnw 命令而非单纯的 mvn,因为某些情况下项目会自带一个名为 mvnw 的 wrapper 来帮助不同平台上的一致性构建过程。 一旦上述步骤顺利完成,浏览器访问 http://localhost:8080 即可见到 RocketMQ 的 Web 监控页面[^1]。 #### 测试连接 此时应该能看到类似“启动成功”的消息输出,表明整个集群正常运作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值