Spring boot 如何使用autowired Spring Boot侦听多个队列?

Spring boot 如何使用autowired Spring Boot侦听多个队列?,spring-boot,rabbitmq,amqp,Spring Boot,Rabbitmq,Amqp,我对Spring boot还不熟悉,我正在玩它。目前,我已经构建了一些应用程序,希望能够通过队列相互通信。 我目前有一个侦听器对象,可以从特定队列接收消息 @Configuration public class Listener { final static String queueName = "myqueue"; @Bean SimpleMessageListenerContainer container(ConnectionFactory connectionF

我对Spring boot还不熟悉,我正在玩它。目前,我已经构建了一些应用程序,希望能够通过队列相互通信。 我目前有一个侦听器对象,可以从特定队列接收消息

@Configuration
public class Listener {

    final static String queueName = "myqueue";

    @Bean
    SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setQueueNames(queueName);
        container.setMessageListener(listenerAdapter);
        return container;
    }

    @Bean
    Receiver receiver() {
        return new Receiver();
    }

    @Bean
    MessageListenerAdapter listenerAdapter(Receiver receiver) {
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }
}
这很有效。但是,现在我希望能够听到另一个队列。所以我想我应该复制上面的对象并更改队列名称。不幸的是,这不起作用,因为SpringBoot只为其中一个创建了连接。
关于如何让我的Spring Boot应用程序侦听多个队列,有什么想法吗?

好的,我找到了如何让它侦听多个队列的方法。我认为与我的其他解决方案相比可能有一些缺点,主要是如果列出的队列不存在,它就不起作用。 我最终使用了一种完全不同的方法,使用@RabbitListener

@Component
public class EventListener {

    private static Logger LOG = LoggerFactory.getLogger(EventListener.class);
    private CountDownLatch latch = new CountDownLatch(1);

    @RabbitListener(queues = "myqueue")
    public void processPaymentMessage(Object message) {
        LOG.info("Message is of type: " + message.getClass().getName());
        if(!(message instanceof byte[])) message = ((Message) message).getBody();
        String content = new String((byte[])message, StandardCharsets.UTF_8);
        LOG.info("Received on myqueue: " + content);
        latch.countDown();
    }

    @RabbitListener(queues = "myotherqueue")
    public void processOrderMessage(Object message) {
        LOG.info("Message is of type: " + message.getClass().getName());
        if(!(message instanceof byte[])) message = ((Message) message).getBody();
        String content = new String((byte[])message, StandardCharsets.UTF_8);           
        LOG.info("Received on myotherqueue: " + content);
        latch.countDown();
    }   
}
字节[]的整个检查都在这里,因为从命令行发送的消息看起来是这样的。否则它就是org.springframework.amqp.core.Message。

您可以试试这个

在application.properties中

rabbitmq.queue.names= com.queue1,com.queue2
在Java文件中

@RabbitListener(queues = "#{'${rabbitmq.queue.names}'.split(',')}")
public void receiveMessage(Message message) {
    try {
        if (processmessage(message)); 
        }
    } catch (Exception ex) {
        LOGGER.error("Exception while processing the Message", ex);
    }

}

下面是我在groovy中的工作:

@Component
@EnableRabbit
@Slf4j
class StatusListener {
    Library library
    int messageCounter

    @Autowired
    StatusListener(Library library) {
        this.library = library
    }

    @RabbitListener(queues = '#{library.allStatusQueues.split(",")}')
    void receiveMessage(Message message) {
        messageCounter++
        log.info("Rabbit Listener received message <" + new String(message.body) + "> (" + messageCounter + ")")
    }
}
application.properties或类似配置文件中的属性本身如下所示:

all-status-queues=queue1,queue2,queue3,queue4
all-status-queues=queue1,queue2,queue3,queue4