修改消息 - 压缩等
存在许多扩展点。它们允许您对消息执行一些处理,无论是在发送到 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 选项。
|
从 2.2.12 版本开始,您可以配置压缩后处理器在内容编码元素之间使用的分隔符。在 2.2.11 及更早版本中,该分隔符被硬编码为 : ,现在默认设置为 , `。解压缩器将同时支持这两个分隔符。但是,如果您使用 2.3 或更高版本发布消息,并使用 2.2.11 或更早版本消费,则必须将压缩器上的 `encodingDelimiter` 属性设置为 |
类似地,SimpleMessageListenerContainer
也具有 setAfterReceivePostProcessors()
方法,允许在容器接收消息后执行解压缩操作。
从 2.1.4 版本开始,RabbitTemplate
中添加了 addBeforePublishPostProcessors()
和 addAfterReceivePostProcessors()
方法,允许分别将新的后处理器追加到发布前和接收后后处理器的列表中。此外,还提供了用于移除后处理器的的方法。类似地,AbstractMessageListenerContainer
也添加了 addAfterReceivePostProcessors()
和 removeAfterReceivePostProcessor()
方法。有关更多详细信息,请参见 RabbitTemplate
和 AbstractMessageListenerContainer
的 Javadoc。