Spring集成 - 配置DefaultMessageListenerContainer以解析多个目标

时间:2011-12-22 14:20:36

标签: spring spring-integration

我需要配置DefaultMessageListenerContainer来解析多个目标主题。我不想实例化多个容器,我想知道如何配置它,或者即使它是可能的。

由于

1 个答案:

答案 0 :(得分:4)

如果您希望使用直接的Spring 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 Integration,只需创建一个消息通道和多个<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提供程序都是不可能的。