何时有用使用@JmsListener id属性?

时间:2016-05-25 20:32:08

标签: spring spring-jms

我有一个使用JMS(ActiveMQ)的Spring App

我有以下内容:

@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());
}

我可以在 Active Subscribers ActiveMQ

中的jmsListenerQueueContainerFactoryForSection01 网络控制台中确认

直到这里我很好。

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

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

我永远无法在id网络控制台中看到ActiveMQ abc 。 我总是看到jmsListenerQueueContainerFactoryForSection01

  • 我知道@JmsListener 并发属性可以覆盖DefaultJmsListenerContainerFactory setConcurrency 方法

但它不适用于id属性。

根据@JmsListener'id api

  

管理此端点的容器的唯一标识符。   如果未指定,则提供自动生成的文件。

因此

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

1 个答案:

答案 0 :(得分:1)

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

getListenerContainerIds() getListenerContainer(String id)

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