什么时候使用 @JmsListener id 属性有用?

When is useful use the @JmsListener id attribute?

我有一个 Spring 使用 JMS (ActiveMQ) 的应用程序

我有以下内容:

@Bean
public DefaultJmsListenerContainerFactory jmsListenerQueueContainerFactoryForSection01(ConnectionFactory selectedConnectionFactory) {
        DefaultJmsListenerContainerFactory djlcf = new DefaultJmsListenerContainerFactory();
        djlcf.setClientId("jmsListenerQueueContainerFactoryForSection01");
        djlcf.setConnectionFactory(selectedConnectionFactory);
        djlcf.setPubSubDomain(false);
        djlcf.setConcurrency("1");
        djlcf.setAutoStartup(true);
        djlcf.setSubscriptionDurable(false);
        return djlcf;
}

关于 @JmsListener 我有:

@JmsListener(destination="springintegration.queue.local.to.section01", 
       containerFactory="jmsListenerQueueContainerFactoryForSection01")
public void receiveToSection01(Message message){
        logger.info("receiveToSection01: {}", message.toString());
}

我可以在 ActiveMQ web console 中确认存在于 Active Subscribers jmsListenerQueueContainerFactoryForSection01

直到现在我都很好。

现在,如果我使用 @JmsListenerid 属性,例如:

@JmsListener(destination="springintegration.queue.local.to.section01",  
             id="abc", 
          containerFactory="jmsListenerQueueContainerFactoryForSection01")
public void receiveToSection01(Message message){
    logger.info("receiveToSection01: {}", message.toString());
}

我从来没有在 ActiveMQ 网络控制台中看到 id abc。 我总是看到 jmsListenerQueueContainerFactoryForSection01

但不适用于 id 属性。

@JmsListener'id api

The unique identifier of the container managing this endpoint. If none is specified, an auto-generated one is provided.

因此

  1. 什么时候使用 @JmsListener id 属性有用?
  2. 我在哪里可以看到 @JmsListener id(在这种情况下是 abc - 甚至是 自动生成的 根据 API)

ID 属性用于管理容器 - JmsListenerEndpointRegistry bean 有方法:

getListenerContainerIds() getListenerContainer(String id)

这允许您单独 stop/start 容器 - 容器本身未在上下文中注册为 bean,因此您无法通过这种方式获取对它们的引用。