gpt4 book ai didi

Spring Autowiring 不适用于 RabbitListenerContainer

转载 作者:行者123 更新时间:2023-12-04 18:02:20 24 4
gpt4 key购买 nike

我正在使用 Spring AMQP 的 MessageListenerContainer 接收来自 RabbitMq Broker 的消息。虽然我能够在 listener 中接收消息,但 Autowiring 在 listener 中不起作用。

这是我配置监听器的方式

@Bean
public SimpleMessageListenerContainer listenerContainer() {
SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer();
listenerContainer.setConnectionFactory(this.inputQueueMgr
.getRabbitConnectionFactory());
JsonMessageConverter converter = new JsonMessageConverter();
listenerContainer.setMessageConverter(converter);
listenerContainer.setMessageListener(new InputQueueEventDispatcher());
listenerContainer.setQueueNames("queue1");
listenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
listenerContainer.setPrefetchCount(1);
return listenerContainer;
}

这是我正在收听来自 rabbitMq 的消息的类

@Component(value = "inputMessageListner")
public class InputQueueEventDispatcher implements Serializable, MessageListener {

private static final long serialVersionUID = -5391659256992655430L;

@Autowired
private volatile InputQueueManagerImpl inputQueueMgr;

@Autowired
private volatile NotificationQueueManagerImpl notificationManager;

@Value("${input.rabbitmq.events.queue}")
private String queueName;

@Autowired
private SubscriptionRepository subRepository;

@SuppressWarnings({ "unchecked" })
@Override
public void onMessage(Message message) {
try {
String messageContent = new String(message.getBody());
.....
}

问题出在 onMessage(Message message) 内部,所有 Autowiring 组件都为 null 。

PS->请注意,我已将所有 Autowiring 实例声明为@Component 并执行适当的 ComponentScan 以适本地扫描它们的包。事实上,这些组件确实在正常流程中 Autowiring ,但由于 onMessage(Message message) 在单独的线程上执行,因此这些值显示为 null 。有没有办法在 listener 中启用 Autowiring 。

谢谢

最佳答案

您已经在您的监听器上设置了一个@Component 注释,但是您没有从上下文中获取这个bean。相反,您正在使用 new 自己创建实例。所以 Spring 无法知道这个实例已经创建并且必须 Autowiring 。

删除那个@Component 注释,并将您的代码更改为

@Bean
public SimpleMessageListenerContainer listenerContainer() {
SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer();
listenerContainer.setConnectionFactory(this.inputQueueMgr
.getRabbitConnectionFactory());
JsonMessageConverter converter = new JsonMessageConverter();
listenerContainer.setMessageConverter(converter);
listenerContainer.setMessageListener(inputMessageListener());
listenerContainer.setQueueNames("queue1");
listenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
listenerContainer.setPrefetchCount(1);
return listenerContainer;
}

@Bean
public InputQueueEventDispatcher inputMessageListener() {
return new InputQueueEventDispatcher();
}

现在,由于 bean 是从 @Bean 注释的方法返回的,Spring 将生成一个 Spring bean 并 Autowiring 它。

关于Spring Autowiring 不适用于 RabbitListenerContainer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32937547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com