在spring jms中定义没有jms命名空间的ListenerContainer

时间:2015-07-27 07:34:30

标签: java spring activemq spring-jms

我想为jms:listener-container bean分配一个id,但不幸的是它没有id属性。例如,这不起作用

<jms:listener-container  id="jmsListenerContainer"  concurrency="${jms.consumer.concurrency}"  >
    <jms:listener id="queueHandler" destination="${jms.queue.name}" ref="queueListener" />
</jms:listener-container>

为了解决这个问题,我试图使用vanilla bean定义来定义没有命名空间的容器,如下所示:

<bean id="jmsListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"  
    p:concurrency="${jms.consumer.concurrency}" p:connection-factory="jmsConnectionFactory" 
    p:messageListener-ref="jmsMessageListener">
</bean>

为了使这个工作,需要容器使用的MessageListener的实际实现类,因为单独定义它不起作用

<jms:listener id="jmsMessageListener" destination="${jms.queue.name}" ref="queueListener" />

这会引发The matching wildcard is strict, but no declaration can be found for element 'jms:listener'.

来自AbstractMessageListenerContainer的文档:By default, only a standard JMS MessageListener object or a Spring SessionAwareMessageListener object will be accepted.

这是非常不确定的,所以有人知道如何做到这一点吗?

1 个答案:

答案 0 :(得分:0)

我想回答一下我自己的问题。使用jms:listener创建的默认侦听器类为org.springframework.jms.listener.adapter.MessageListenerAdapter

以下是基于jms命名空间的配置的完整vanilla替换:

<bean class="org.springframework.jms.listener.adapter.MessageListenerAdapter" id="jmsMessageListener" 
    p:delegate-ref="queueListener" />

<!-- Not using jms namespace, as it doesn't allow to specify bean id -->
<bean id="jmsListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"  
    p:concurrency="${jms.consumer.concurrency}" p:connection-factory-ref="jmsConnectionFactory" 
    p:messageListener-ref="jmsMessageListener" p:destinationName="${jms.queue.name}" >
</bean>