使用永久队列作为回复通道的Spring批量分区

时间:2015-01-14 02:41:23

标签: spring spring-batch spring-integration

此问题最初在此处讨论过:

Partitioned jobs using reply destination

但是,我想澄清我所看到的。首先,这适用于在多服务器群集上运行40多个分区作业的系统。入站网关的配置现在是:

<int-jms:inbound-gateway id="springbatch.inbound.gateway" 
  connection-factory="springbatch.jmsConnectionFactory" 
  request-channel="springbatch.slave.jms.request" 
  request-destination="requestsQueue" 
  reply-channel="springbatch.slave.jms.response" 
  concurrent-consumers="2" 
  max-concurrent-consumers="2"/>

出站网关是:

<int-jms:outbound-gateway 
  id="outbound-gateway-1"   
  auto-startup="false"
  connection-factory="jmsConnectionFactory" 
  request-channel="partitioned.jms.requests" 
  request-destination="jms.requestsQueue" 
  reply-channel="partitioned.jms.reply" 
  reply-destination="jms.repliesQueue"
  correlation-key="JMSCorrelationID">
  <int-jms:reply-listener/>        
</int-jms:outbound-gateway>

然后我添加了一个作业监听器来启动和停止作业启动和停止时的出站网关。当我启动系统时,JBoss JMX控制台显示请求队列中有2个使用者,并且响应队列中没有消费者按预期方式。

当分区作业启动时,作业侦听器会在网关上调用start,并将其视为处理程序。然后还添加了另一个处理程序(来自BridgeHandler的{​​{1}}),并且回复队列现在在回复队列上显示2个消费者。消息被发送,处理,响应返回,并由网关回复侦听器拾取并且作业完成。侦听器然后在网关上调用stop并将其作为处理程序删除。回复队列仍然有一个额外的消费者。

如果我尝试再次运行分区作业,则侦听器会在网关上调用start,并且在回复队列中有2个使用者。消息被发送,处理,返回响应。消息显示在回复队列中,但它们从未被拾取并且作业挂起。

因此,似乎停止和启动出站网关可能还不够。

  • 如果额外的处理程序来自replyListener,那么作业监听器是否也需要停止并启动它?
  • 如果额外的处理程序来自其他东西,我该如何控制呢?
  • 如何进一步隔离并解决问题?

由于

2 个答案:

答案 0 :(得分:0)

this gist中的测试对我来说很好。

你能在你的环境中测试吗?

如果成功,请将调试日志与实际应用程序中的日志进行比较。

如果失败,请从某个地方的测试中上传一个TRACE级别日志。

由于

答案 1 :(得分:0)

我查看了您的测试用例,发现连接工厂结构存在差异。我的配置是通过以下方式创建连接工厂:


        <jee:jndi-lookup id="springbatch.jmsConnectionFactory" jndi-name="${connectionFactoryName}"/>>

当我从测试用例更改为配置时:


    <jee:jndi-lookup id="jboss.jmsConnectionFactory" jndi-name="${connectionFactoryName}"/>
    <bean id="springbatch.jmsConnectionFactory"
        class="org.springframework.jms.connection.CachingConnectionFactory">
        <property name="targetConnectionFactory" ref="springbatch.jboss.jmsConnectionFactory"/>
        <property name="sessionCacheSize" value="10" />
        <property name="cacheProducers" value="true" />
        <property name="cacheConsumers" value="false" />
    </bean>

现在我看到了初步测试中处理的消息。所以我猜这个问题是消费者的缓存。问题是jms连接工厂的正确配置是什么。引用app服务器的jms连接有两个选项:

  • 聚集
  • 非聚集

Spring有3个选项:

  • 非wrappered
  • SingleConnectionFactory
  • CachingConnectionFactory

在这6个选项中,最佳配置是什么?为什么?