使用回复目标的分区作业

时间:2014-12-20 20:57:58

标签: spring-batch spring-integration

我们有一个JEE应用程序,它在群集上使用大约40个分区作业。它可以部署在JBoss和WebSphere上。我们遇到了两个问题:

  • JBoss和WebSphere中的消息传递系统故障通常与临时队列连接问题有关

  • 由于邮件丢失,分区作业有效挂起。

我读了一篇帖子,即切换reply-destination的{​​{1}}可以提高稳健性,并在出现故障时允许重新连接。 outbound-gateway基本上在requestQueue上启动了2个侦听器。

inbound-gateway

每个作业都有一个单独的<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"/>

outbound-channel

它在单个服务器上运行正常,但是当在群集上运行时,分区在群集周围运行,但主步骤不会得到确认。我认为<int-jms:outbound-gateway connection-factory="springbatch.jmsConnectionFactory" request-channel="jms.channel.1" request-destination="requestsQueue" reply-channel="jms.channel.2" reply-destination="repliesQueue" correlation-key="JMSCorrelationID" > <int-jms:reply-listener /> </int-jms:outbound-gateway> 作为关联键将处理匹配JMS消息。

我错过了配置文件吗?

1 个答案:

答案 0 :(得分:1)

你应该做些什么;在该模式下,相关ID设置为gatewayId+n(其中gatewayIdUUIDn增量)。回复容器消息选择器设置为JMSCorrelationID LIKE gatewayId%,因此步骤执行结果应正确路由回主服务器。我建议你打开DEBUG日志记录并按照双方的消息来查看正在发生的事情。

修改

Re:共享JMS端点(下面的评论)。

可以做到,但需要进行一些重组。

在生产者(主)方面,网关和独立聚合器必须移动到父上下文(每个作业上下文都是它的子级)。由于分区处理程序必须位于子上下文中,因此您需要一个单独的聚合器类;也就是说,聚合与分区正交,为方便起见,它只是在那个bean中。公共聚合器很好,因为它使用分区处理程序的相关ID来执行作业,重组的步骤执行结果将被路由到正确的分区处理程序。

消费者(奴隶)方面有点棘手,因为如果入站网关在单个(父)上下文中),它将无法看到子上下文中的stepExecutionRequestHandler s'通道;您需要构建路由器以将请求路由到适当的作业上下文。并非不可能,只需要多做一点工作。

dynamic-ftp Spring Integration sample及其README是一个很好的起点。