无法在MessageListener类AMQP中自动装配bean

时间:2015-07-30 13:54:38

标签: java spring rabbitmq amqp autowired

确定。所以我有一个带有一些常量的兔子配置类,我尝试将一个服务添加到我的listenercontainer监听器。

@Configuration
public class RabbitConfig {

@Bean
public ConnectionFactory connectionFactory() {
    CachingConnectionFactory connectionFactory = new CachingConnectionFactory(HOST);
    connectionFactory.setPort(CONN_PORT);
    connectionFactory.setUsername(USERNAME);
    connectionFactory.setPassword(PASSWORD);
    return connectionFactory;
}

@Bean
public AmqpAdmin amqpAdmin() {
    return new RabbitAdmin(connectionFactory());
}

@Bean
public RabbitTemplate rabbitTemplate() {
    RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory());
    rabbitTemplate.setReplyQueue(replyQueue());
    rabbitTemplate.setCorrelationKey(UUID.randomUUID().toString());
    return rabbitTemplate;
}

@Bean
public Queue replyQueue() {
    return new Queue(REPLY_QUEUE_NAME);
}

@Bean
public SimpleMessageListenerContainer messageListenerContainer() {

    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory());
    container.setQueueNames(QUEUE_NAME);
    container.setMessageListener(messageListener());
    return container;
}

@Bean
public MessageListener messageListener(){
    return new RabbitListener();
}

}

我正在尝试注入messagelistener,它是在我的项目的最后一行中创建的一个服务。这会触发无法自动装配字段的错误,就好像该字段不是由Spring管理一样。我做了一些研究,并且我验证了我的组件扫描包,它已经设置为所有项目,我已经使用@Component注释了rabbitlistener,所以我无法找到错误或者为什么Spring无法在我的监听器类中自动挂载该字段。这是代码。

@Component
public class RabbitListener implements MessageListener {
Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
ImagesService imagesService;


@Override
public void onMessage(Message message) {
//processing message
}

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果你分享完整的StackTrace会更好,但我建议你做这样的事情:

  1. 为您的@ComponentScan课程添加@Configuration,并在那里指定那些包含RabbitListenerImagesService

  2. 的包
  3. 使用@Component标记最后两个(是的,我在RabbitListener上看到了这一点,但不清楚ImagesService的位置以及它是如何绕过它的)

  4. @Autowire RabbitListener RabbitConfig代替@Bean而不是@Component

  5. 小心@Bean@ComponentScan混合:当然,如果你有import java.util.Scanner; public class OddEvenInt { public static void main(String args[]) { Scanner s = new Scanner(System. in ); int x; do { System.out.println("Enter an integer to check if it is odd or even "); x = s.nextInt(); if (x % 2 == 0) System.out.println("You entered an even number."); else System.out.println("You entered an odd number."); } while (x % 2 == 0); } } 的那个包,你最终会得到两个bean。

答案 1 :(得分:0)

好的,您需要@Autowire RabbitListener bean。由于RabbitListener是需要由IOC管理的bean,由于已声明为@Component,因此@runtime RabbitListener不在上下文中,因此将其自动连接到config类像这样

@Configuration
public class RabbitConfig {

@Bean
public ConnectionFactory connectionFactory() {
    CachingConnectionFactory connectionFactory = new CachingConnectionFactory(HOST);
    connectionFactory.setPort(CONN_PORT);
    connectionFactory.setUsername(USERNAME);
    connectionFactory.setPassword(PASSWORD);
    return connectionFactory;
}

@Bean
public AmqpAdmin amqpAdmin() {
    return new RabbitAdmin(connectionFactory());
}

@Bean
public RabbitTemplate rabbitTemplate() {
    RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory());
    rabbitTemplate.setReplyQueue(replyQueue());
    rabbitTemplate.setCorrelationKey(UUID.randomUUID().toString());
    return rabbitTemplate;
}

@Bean
public Queue replyQueue() {
    return new Queue(REPLY_QUEUE_NAME);
}

@Bean
public SimpleMessageListenerContainer messageListenerContainer() {

    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory());
    container.setQueueNames(QUEUE_NAME);
    container.setMessageListener(rabbitListener); // reference the autowired RabbitListener on this line
    return container;
}

@Autowire
private RabbitListener rabbitListener;
}

应该可以解决此错误。