1

我有一个 JMS connectionFactory,许多 spring 集成 jms 入站网关都使用它。它们工作正常,但一次只有一条消息。我想让他们在不同的线程中一次处理 N 条并发消息。

我现在得到的代码如下。

弹簧配置.xml

<import resource="commons/jmsConnectionFactory.xml"/>
<import resource="chain/chain1.xml"/>
<import resource="chain/chain2.xml"/>

jmsConnectionFactory.xml

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL">
        <value>failover:(tcp://mqmaster:61616,tcp://mqslave:61616)?jms.prefetchPolicy.all=1&amp;randomize=false</value>
    </property>
</bean>

链条看起来都像这样

<int:channel id="fooChannel"/>
<int-jms:inbound-gateway request-channel="fooChannel" request-destination-name="foo" extract-request-payload="true" />
<int:chain input-channel="fooChannel">
  <int-http:outbound-gateway
     url="...."
     http-method="GET" 
     extract-request-payload="true" />
  <int:object-to-string-transformer />
</int:chain>

我知道我可以在入站网关中添加“concurrent-consumers”和“max-concurrent-consumers”,让网关处理多条消息。这将导致每个链/网关处理它的线程独立管理。我想要一些方法来为使用 JMS 连接的每个人定义一个公共线程池。这将允许我指定 5 个线程并根据服务器提供的消息在网关之间分配它们,但将消费服务器限制在可管理的工作量上。

多线程处理需要哪些修改?以及如何限制线程数?

4

2 回答 2

1

入站网关消息驱动通道适配器的扩展,因此您可以使用提供的所有属性DefaultMessageListenerContainer。其中之一定义了并发消费者容器使用的数量:

<int-jms:inbound-gateway
    request-channel="fooChannel"
    request-destination-name="foo"
    extract-request-payload="true"
    concurrent-consumers="10" />

您可以在此处找到更多信息。

更新:看来您可以在inbound-gatewayusingcontainer属性中指定对容器实现的引用。也就是说,您可以在容器和网关之间重用一个任务执行器实例:

<int-jms:inbound-gateway
    request-channel="fooChannel"
    request-destination-name="foo"
    extract-request-payload="true"
    container="fooChannelContainer" />

<bean id="fooChannelContainer" class="org.springframework.jms.listener.SimpleMessageListenerContainer" destroy-method="destroy">
    ...
    <property name="taskExecutor" ref="jmsTaskExecutor" />
</bean>
于 2013-05-23T16:32:47.553 回答
0

正如 hoaz 建议的那样,taskExecutor 是解决方案。

<task:executor id="taskExecutor" pool-size="4"/>

<int:channel id="fooChannel">
  <int:dispatcher task-executor="taskExecutor"/>
</int:channel>
于 2013-05-23T22:12:13.187 回答