我想为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.
这是非常不确定的,所以有人知道如何做到这一点吗?
答案 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>