使用Spring Boot编写web应用程序时,您可以声明您的bean是会话或请求范围的一部分。
是否可以使用@RabbitListener接收的消息创建一个数据注入范围?
当使用RabbitListener接收消息时,我希望初始化一些元数据,以便在消息处理期间调用的代码中注入这些元数据。(例如,用于日志记录的接收队列,或者预先配置的工厂,其中配置取决于在接收消息时已知的参数(。
通过所有调用的方法传递这些数据感觉很难看。
我能想到但不知道怎么做的方法:
- AOP
- 自定义作用域
非常感谢您的帮助!
可能最简单的方法是使用MessagePostProcessor
(通过afterReceivePostProcessors
属性添加到容器/容器工厂(。
/**
* 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
来存储元数据;然后可以访问侦听器中的元数据。