跳到主要内容

修改消息 - 压缩及其他

DeepSeek V3 中英对照 Modifying Messages - Compression and More

存在多个扩展点。它们允许你在消息发送到 RabbitMQ 之前或接收之后立即对消息进行一些处理。

正如在消息转换器中所见,其中一个扩展点是在 AmqpTemplateconvertAndReceive 操作中,你可以在其中提供一个 MessagePostProcessor。例如,在你的 POJO 被转换后,MessagePostProcessor 允许你在 Message 上设置自定义的头部或属性。

从 1.4.2 版本开始,RabbitTemplate 新增了两个扩展点 —— setBeforePublishPostProcessors()setAfterReceivePostProcessors()。第一个扩展点允许在消息发送到 RabbitMQ 之前立即运行一个后处理器。当使用批处理时(参见 Batching),该后处理器在批处理组装完成之后、发送之前被调用。第二个扩展点则在消息接收之后立即被调用。

这些扩展点用于诸如压缩等功能,为此提供了多个 MessagePostProcessor 实现。GZipPostProcessorZipPostProcessorDeflaterPostProcessor 在发送前对消息进行压缩,而 GUnzipPostProcessorUnzipPostProcessorInflaterPostProcessor 则对接收到的消息进行解压缩。

备注

从 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() 方法。有关更多详细信息,请参阅 RabbitTemplateAbstractMessageListenerContainer 的 Javadoc。