跳到主要内容
版本:4.1.1

修改消息——压缩及更多

Doubao 中英对照 Modifying Messages - Compression and More

存在许多扩展点。它们让你可以在消息发送到 RabbitMQ 之前或收到消息之后立即对消息执行一些处理。

正如消息转换器中所示,其中一个扩展点位于 AmqpTemplate 的 convertAndReceive 操作中,你可以在那里提供一个 MessagePostProcessor。例如,在你的 POJO 转换完成后,MessagePostProcessor 让你可以在 Message 上设置自定义头或属性。

从 1.4.2 版本开始,RabbitTemplate 新增了一些扩展点——setBeforePublishPostProcessors() 和 setAfterReceivePostProcessors()。前者让后置处理器在发送到 RabbitMQ 之前立即运行。使用批量处理时(参见批量处理),它会在批处理组装完成之后、批次发送之前被调用。后者则在收到消息之后立即调用。

这些扩展点用于压缩等功能,为此提供了多个 MessagePostProcessor 实现。GZipPostProcessor、ZipPostProcessor 和 DeflaterPostProcessor 在发送前压缩消息,而 GUnzipPostProcessor、UnzipPostProcessor 和 InflaterPostProcessor 则解压收到的消息。

备注

从 2.1.5 版本开始,可以为 GZipPostProcessor 配置 copyProperties = true 选项,以复制原始消息属性。默认情况下,出于性能原因,这些属性会被复用,并随压缩内容编码以及可选的 MessageProperties.SPRING_AUTO_DECOMPRESS 头一起修改。如果你保留了对原始出站消息的引用,它的属性也会随之改变。因此,如果你的应用程序在使用这些消息后置处理器时保留了出站消息的副本,请考虑开启 copyProperties 选项。

important

从 2.2.12 版本开始,你可以配置压缩后置处理器在内容编码元素之间使用的分隔符。在 2.2.11 及更早版本中,它被硬编码为 :,现在默认为 , 。解压器对两种分隔符都适用。但是,如果你用 2.3 或更高版本发布消息、用 2.2.11 或更早版本消费消息,则必须在压缩器上把 encodingDelimiter 属性设置为 :。当你的消费者升级到 2.2.11 或更高版本后,可以恢复为默认的 , 。

类似地,SimpleMessageListenerContainer 也有一个 setAfterReceivePostProcessors() 方法,让你可以在容器收到消息后执行解压。

从 2.1.4 版本开始,RabbitTemplate 新增了 addBeforePublishPostProcessors() 和 addAfterReceivePostProcessors() 方法,分别用于向发布前和接收后后置处理器列表追加新的后置处理器。同时还提供了移除这些后置处理器的方法。类似地,AbstractMessageListenerContainer 也新增了 addAfterReceivePostProcessors() 和 removeAfterReceivePostProcessor() 方法。更多细节请参阅 RabbitTemplate 和 AbstractMessageListenerContainer 的 Javadoc。