我可以为JNDI的主题提供一个带有两个MessageListener的DefaultMessageListenerContainer吗?

时间:2014-10-23 13:49:50

标签: java spring jms jndi

我想创建两个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)给予侦听器 - 容器的目标解析器属性和目标属性作为侦听器中的可选项)

0 个答案:

没有答案