修改消息 - 压缩及其他
存在多个扩展点。它们允许您在消息发送至 RabbitMQ 之前或在接收到消息后立即执行某些处理。
如 消息转换器 中所示,其中一个扩展点位于 AmqpTemplate convertAndReceive 操作中,您可在此处提供一个 MessagePostProcessor。例如,在您的 POJO 被转换后,MessagePostProcessor 允许您在 Message 上设置自定义头信息或属性。
从版本 1.4.2 开始,已在 RabbitTemplate - setBeforePublishPostProcessors() 和 setAfterReceivePostProcessors() 中添加了额外的扩展点。第一个扩展点允许后处理器在将消息发送至 RabbitMQ 之前立即执行。当使用批处理(参见 批处理)时,该扩展点在批处理组装完成后、发送批处理之前被调用。第二个扩展点则在接收到一条消息后立即被调用。
这些扩展点用于诸如压缩等功能,为此提供了几种 MessagePostProcessor 实现。 GZipPostProcessor、ZipPostProcessor 和 DeflaterPostProcessor 在发送前对消息进行压缩,而 GUnzipPostProcessor、UnzipPostProcessor 和 InflaterPostProcessor 则对收到的消息进行解压缩。
从版本 2.1.5 开始,可以使用 copyProperties = true 选项将 GZipPostProcessor 配置为复制原始消息属性的副本。默认情况下,出于性能考虑,这些属性会被复用,并通过压缩内容编码及可选的 MessageProperties.SPRING_AUTO_DECOMPRESS 头部进行修改。如果您保留了原始出站消息的引用,其属性也会随之发生变化。因此,如果您的应用程序保留了包含这些消息后处理器的出站消息副本,请考虑启用 copyProperties 选项。 |
| 从版本 2.2.12 开始,您可以配置压缩后处理器在内容编码元素之间使用的分隔符。 在 2.2.11 版本及之前,该分隔符被硬编码为 当您的消费者升级到 2.2.11 或更高版本时,您可以恢复默认的 `, `。 |
同样,SimpleMessageListenerContainer 也具有一个 setAfterReceivePostProcessors() 方法,使得解压缩操作在消息被容器接收后执行。
从版本 2.1.4 开始,addBeforePublishPostProcessors() 和 addAfterReceivePostProcessors() 已被添加到 RabbitTemplate 中,以允许分别向“发布前”和“接收后”的后处理器列表中追加新的后处理器。此外,还提供了用于移除后处理器的方法。同样地,AbstractMessageListenerContainer 也新增了 addAfterReceivePostProcessors() 和 removeAfterReceivePostProcessor() 方法。有关更多详情,请参阅 RabbitTemplate 和 AbstractMessageListenerContainer 的 Javadoc 文档。