修改消息 - 压缩及更多内容
存在许多扩展点。它们允许你在消息发送到 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 属性设置为 : 。当你的消费者升级到 2.2.11 或更高版本后,你可以恢复为默认的 , 。 |
类似地,SimpleMessageListenerContainer
也提供了 setAfterReceivePostProcessors()
方法,允许在容器接收到消息后执行解压操作。
从 2.1.4 版本开始,RabbitTemplate
中增加了 addBeforePublishPostProcessors()
和 addAfterReceivePostProcessors()
方法,分别用于在发布前和接收后后置处理器列表中添加新的后置处理器。还提供了移除后置处理器的方法。类似地,AbstractMessageListenerContainer
也增加了 addAfterReceivePostProcessors()
和 removeAfterReceivePostProcessor()
方法。详情请参阅 RabbitTemplate
和 AbstractMessageListenerContainer
的 Javadoc。