修改消息 - 压缩及更多

存在许多扩展点。它们允许您对消息执行一些处理,无论是在发送到 RabbitMQ 之前还是在接收后立即进行。

消息转换器 中所示,一个这样的扩展点位于 AmqpTemplate convertAndReceive 操作中,您可以在其中提供一个 MessagePostProcessor。例如,在您的 POJO 转换后,MessagePostProcessor 允许您在 Message 上设置自定义标头或属性。

从 1.4.2 版本开始,已向 RabbitTemplate 添加了其他扩展点 - setBeforePublishPostProcessors()setAfterReceivePostProcessors()。第一个使后处理器能够在发送到 RabbitMQ 之前立即运行。当使用批处理(请参阅 批处理)时,在组装批处理后且发送批处理之前调用此方法。第二个在消息接收到后立即调用。

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

从 2.1.5 版本开始,可以通过 copyProperties = true 选项配置 GZipPostProcessor 以复制原始消息属性。默认情况下,出于性能原因会重用这些属性,并使用压缩内容编码和可选的 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。