使用Spring的JMS命名空间时,侦听器容器的id是多少?

时间:2014-02-04 17:16:51

标签: java spring spring-integration spring-jms

根据JMS命名空间标记的Spring Documentation(即<jms:listener-container>),id元素没有<jms:listener-container>属性。

如果没有id的话,如何从其他bean定义中引用侦听器容器bean?

例如,假设我定义了以下Listener容器:

<jms:listener-container acknowledge="auto"
    connection-factory="queueConnectionFactoryBean"
    container-type="default"
    destination-resolver="jndiDestinationResolver"
    destination-type="queue"
    message-converter="myConverter">

    <jms:listener ref="myListenerPOJO" id="myQueueListener"
        method="processThePOJO" destination="${myQueueListener.queue.jndiName}" />

</jms:listener-container>

我想定义一个使用上述容器的入站网关。我将使用什么作为入站网关定义的container属性?

示例:

<int-jms:inbound-gateway 
    request-channel="inboundChannel"
    id="messageChannelAdapter"
    container="**What Goes Here?**"
    reply-channel="outboundChannel" />

或者我误解了侦听器容器和网关之间的关系?

2 个答案:

答案 0 :(得分:5)

listener-container元素不用于配置独立的JMS侦听器容器。它旨在充当所有封闭的listener标记的蓝图。在运行时,实际发生的是为每个封闭的listener构造JMS侦听器容器。所以没有一个容器而是多个容器。

正如@artembilan所提到的,容器的id被设置为监听器的id。但是,当您重复使用侦听器进行spring集成时,它会使侦听器无用。侦听器容器只能连接一个MessageListener,而不能连接多个。

如果要为Spring Integration网关使用侦听器容器,则必须使用其中一个*MessageListenerContainer类自行构建一个。

答案 1 :(得分:3)

正如Marten所说,listener-container为每个MessageListenerContainer子元素假设listener个bean。目标MessageListenerContainer从侦听器的id获取id是多么神奇。

因此,在您的情况下,<int-jms:inbound-gateway>的{​​{1}}应该应用值 myQueueListener