2011-12-22 39 views

回答

3

如果您想監聽使用直線彈簧JMS多個主題的消息,您將需要創建這個類的多個實例。唯一的問題是默認情況下每個都會創建自己的TaskExecutor,這有點浪費。爲了解決這個問題,只需在上下文中定義自己的taskExecutor bean,並且所有消息偵聽器都會自動使用它。

這是一個任務執行器,它可以在獨立的虛擬機中很好地工作,有不同容器的本地工作管理器/線程池功能集成的替代實現。

<bean id="taskExecutor" class="org.springframework.scheduling.quartz.SimpleThreadPoolTaskExecutor"> 
    <property name="waitForJobsToCompleteOnShutdown" value="true"/> 
    <property name="threadCount" value="20"/> 
    <property name="threadNamePrefix" value="JmsConsumer"/> 
</bean> 

或者,使用Spring集成,簡單地創建一個消息信道和多個<jms:message-driven-channel-adapter/>的 - 每個主題。這裏是一個示例代碼片段:

<bean id="connectionFactory" class="..."/> 

<int:channel id="allMessages"/> 

<jms:message-driven-channel-adapter channel="allMessages" connection-factory="connectionFactory" destination-name="T.topic1"/> 
<jms:message-driven-channel-adapter channel="allMessages" connection-factory="connectionFactory" destination-name="T.topic2"/> 
<jms:message-driven-channel-adapter channel="allMessages" connection-factory="connectionFactory" destination-name="T.topic3"/> 

<int:service-activator input-channel="allMessages" output-channel="results" ref="messageProcessingBean" method="onMessage"/> 

在幕後,Spring Integration將自動創建一個MessageListenerContainer。

還有一種替代方法是使用JMS提供程序/ MOM的路由功能來創建一個路由所有相關消息的單個目標。例如。在RabbitMQ中,您可以創建一個綁定到多個交換機的主題,因此只能使用一個AMQP目標。然而,這與基礎設施有關,對任何給定的JMS提供者都是不可能的。