我正在使用SpringJMS4.1注册消息侦听器
在我的xml配置文件中,我定义了一个名为“jmsListenerContainerFactory”的bean:
<bean id="jmsListenerContainerFactory"
class="org.springframework.jms.config.DefaultJmsListenerContainerFactory"...p:concurrency="3-5".../><jms:listener-container ... />。
SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
endpoint.setDestination("...");
endpoint.setMessageListener(message -> {...});
registrar.registerEndpoint(endpoint);还是我们必须以这样的方式显式地设置它?例如:registrar.setContainerFactoryBeanName("jmsListenerContainerFactory");
谢谢
发布于 2014-11-12 18:50:32
我不理解您的第一个问题;在第一个例子中,您定义的是一个DefaultJmsListenerContainerFactory (一个创建侦听器容器的工厂),而XML是直接创建一个侦听器容器。
如果您需要创建许多具有类似属性的容器,那么工厂是很有用的。
对于简单的容器配置,当您不使用带注释的侦听器时,对容器使用传统的XML或@Bean定义肯定会更简单。
对于第二个问题,当容器工厂bean被传递到configureListeners方法时,默认的注册器已经被填充到容器工厂bean名称中;您不必设置它。
发布于 2021-01-19 12:17:16
SimpleJmsListenerEndpoint总是查找名为"jmsListenerContainerFactory“的bean。因此,即使没有显式设置:
registrar.setContainerFactoryBeanName("jmsListenerContainerFactory");如果存在bean“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());
}
}这是春天的虫子。
https://stackoverflow.com/questions/26884139
复制相似问题