在 Spring Boot 中的一个 AMQP 消息的上下文中注入范围 bean
Injecting scoped beans in the context of one AMQP message in Spring Boot
使用 Spring Boot 编写 Web 应用程序时,您可以将 bean 声明为会话或请求范围的一部分。
是否可以使用@RabbitListener 接收到的消息创建一个数据注入范围?
当使用 RabbitListener 接收消息时,我想初始化一些元数据,我希望这些元数据可用于在消息处理期间调用的代码中注入。 (例如,用于日志记录的接收队列,或配置取决于消息接收时已知参数的预配置工厂)。
通过所有调用的方法传递此数据感觉很丑陋。
能想到但不知道怎么做的方法:
- AOP
- 自定义范围
非常感谢帮助!
可能最简单的方法是使用 MessagePostProcessor
(通过 afterReceivePostProcessors
属性 添加到 container/container 工厂)。
/**
* Set {@link MessagePostProcessor}s that will be applied after message reception, before
* invoking the {@link MessageListener}. Often used to decompress data. Processors are invoked in order,
* depending on {@code PriorityOrder}, {@code Order} and finally unordered.
* @param afterReceivePostProcessors the post processor.
* @since 1.4.2
*/
public void setAfterReceivePostProcessors(MessagePostProcessor... afterReceivePostProcessors) {
Assert.notNull(afterReceivePostProcessors, "'afterReceivePostProcessors' cannot be null");
Assert.noNullElements(afterReceivePostProcessors, "'afterReceivePostProcessors' cannot have null elements");
this.afterReceivePostProcessors = MessagePostProcessorUtils.sort(Arrays.asList(afterReceivePostProcessors));
}
使用ThreadLocal
来存储元数据;然后您可以访问侦听器中的元数据。
使用 Spring Boot 编写 Web 应用程序时,您可以将 bean 声明为会话或请求范围的一部分。
是否可以使用@RabbitListener 接收到的消息创建一个数据注入范围?
当使用 RabbitListener 接收消息时,我想初始化一些元数据,我希望这些元数据可用于在消息处理期间调用的代码中注入。 (例如,用于日志记录的接收队列,或配置取决于消息接收时已知参数的预配置工厂)。
通过所有调用的方法传递此数据感觉很丑陋。
能想到但不知道怎么做的方法:
- AOP
- 自定义范围
非常感谢帮助!
可能最简单的方法是使用 MessagePostProcessor
(通过 afterReceivePostProcessors
属性 添加到 container/container 工厂)。
/**
* Set {@link MessagePostProcessor}s that will be applied after message reception, before
* invoking the {@link MessageListener}. Often used to decompress data. Processors are invoked in order,
* depending on {@code PriorityOrder}, {@code Order} and finally unordered.
* @param afterReceivePostProcessors the post processor.
* @since 1.4.2
*/
public void setAfterReceivePostProcessors(MessagePostProcessor... afterReceivePostProcessors) {
Assert.notNull(afterReceivePostProcessors, "'afterReceivePostProcessors' cannot be null");
Assert.noNullElements(afterReceivePostProcessors, "'afterReceivePostProcessors' cannot have null elements");
this.afterReceivePostProcessors = MessagePostProcessorUtils.sort(Arrays.asList(afterReceivePostProcessors));
}
使用ThreadLocal
来存储元数据;然后您可以访问侦听器中的元数据。