我想创建两个MessageListeners。 我有一个可以使用JNDI收到的主题 (名称:jms / eventsTopic)。
我知道可以创建以下配置:
<jms:listener-container ...
<jms:listener destination="topic" ref="listener1" />
<jms:listener destination="topic" ref="listener2" />
</jms:listener-container>
但如果Topic来自JNDI,我需要使用JndiObjectFactoryBean。
<bean id="eventsTopic" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jms/eventsTopic"/>
<property name="jndiTemplate" ref="jndiTemplate"/>
</bean>
我不能将eventsTopic作为对jms:listener的引用,因为destination属性只接受名称,而不是对JndiObjectFactoryBean的引用。
我知道可以使用目标解析器来提供参考。它应该像:
<jms:listener-container destination-resolver="eventsTopic" ... >
我没有尝试这个,因为在侦听器容器内部我必须放置侦听器,但我不知道应该将什么放在侦听器的denstination属性中。
我只是通过将两个容器声明为豆子来实现我的目标:
<bean id="firstContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="eventsTopic" />
<property name="messageListener" ref="firstListener" />
</bean>
<bean id="secondContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="eventsTopic" />
<property name="messageListener" ref="secondListener" />
</bean>
我可以这样做,因为我不需要为侦听器声明目标(作为文本)。而不是我需要将JNDI引用给容器。
但是将容器声明为bean,就不可能在一个容器中提供两个监听器。这就是我必须创建两个容器的原因。
如果我是对的,如果可以进行以下配置应该会更好:
<jms:listener-container destination-resolver="eventsTopic" connection-factory="connectionFactory">
<jms:listener ref="listener1" />
<jms:listener ref="listener2" />
</jms:listener-container>
(JNDI引用一个主题(JndiObjectFactoryBean)给予侦听器 - 容器的目标解析器属性和目标属性作为侦听器中的可选项)