修改消息 - 压缩及更多内容

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

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

从 1.4.2 版本开始,RabbitTemplate 中增加了额外的扩展点 - setBeforePublishPostProcessors()setAfterReceivePostProcessors()。第一个允许在发送到 RabbitMQ 之前立即运行一个后置处理器。使用批处理时(参见批处理),它在批处理组装后、发送前被调用。第二个在消息接收后立即被调用。

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

从 2.1.5 版本开始,GZipPostProcessor 可以配置 copyProperties = true 选项以创建原始消息属性的副本。默认情况下,出于性能考虑会重用这些属性,并使用压缩内容编码和可选的 MessageProperties.SPRING_AUTO_DECOMPRESS 头部进行修改。如果你保留了原始出站消息的引用,其属性也会随之改变。因此,如果你的应用程序使用这些消息后置处理器保留了出站消息的副本,请考虑开启 copyProperties 选项。
从 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。