“jmsListenerContainerFactory”是SimpleJmsListenerEndpoint使用的默认工厂

时间:2014-11-12 10:02:16

标签: spring spring-jms

我正在使用Spring JMS 4.1来注册消息监听器

在我的xml配置文件中,我定义了一个名为" jmsListenerContainerFactory"的bean:

<bean id="jmsListenerContainerFactory"
          class="org.springframework.jms.config.DefaultJmsListenerContainerFactory"...p:concurrency="3-5".../>
  • 第一个问题:对于Spring 4.x版本,最好以这种方式声明这个工厂:<jms:listener-container ... />

  • 第二个主要问题:如官方文档(24.6.1)中所述:默认情况下,基础结构会查找名为jmsListenerContainerFactory的bean作为工厂用于创建消息侦听器容器的源。以这种方式以编程方式注册端点也是如此:

SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
endpoint.setDestination("...");
endpoint.setMessageListener(message -> {...});
registrar.registerEndpoint(endpoint);

或者我们必须以这种方式明确地设置它,例如:registrar.setContainerFactoryBeanName("jmsListenerContainerFactory");

由于

2 个答案:

答案 0 :(得分:0)

我不明白你的第一个问题;在第一种情况下,您正在定义DefaultJmsListenerContainerFactory(创建侦听器容器的工厂),而XML正在直接创建侦听器容器。

如果您需要创建大量具有类似属性的容器,工厂非常有用。

对于简单容器配置,当您不使用带注释的侦听器时,使用传统XML或容器的@Bean定义当然可能更简单。

对于第二个问题,默认注册商在传递到configureListeners方法时已经填充了容器工厂bean名称;你不必设置它。

答案 1 :(得分:0)

SimpleJmsListenerEndpoint 总是寻找命名的 bean “jmsListenerContainerFactory”。所以即使没有明确设置:

registrar.setContainerFactoryBeanName("jmsListenerContainerFactory");
如果存在 bean“jmsListenerContainerFactory”,

JmsListenerEndpoint 仍然可以找到 JmsListenerContainerFactory。 这意味着,如果您需要使用不同的 bean 名称应用 JmsListenerContainerFactory,则在方法 registrar.setContainerFactoryBeanName("") 上的设置根本不起作用。

以下适用于工作和非工作案例的代码:

// config factory class
@Bean(name = "customJMSListenerContainerFactory")
public DefaultJmsListenerContainerFactory 
listenerQueueFactory() {
DefaultJmsListenerContainerFactory factory = new 
DefaultJmsListenerContainerFactory();
//more configs...
return factory;
}

// on consumer class 
@Configuration
@EnableJms
public class MyConsumer implements JmsListenerConfigurer {
@Override
public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {

SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
registrar.registerEndpoint(endpoint);
// this setting will not work => Spring JMS bug 
registrar.setContainerFactoryBeanName("customJMSListenerContainerFactory");
// but this setting works
registrar.setContainerFactory(listenerQueueFactory());
 }
}

这是spring jms的bug。