我们有一个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消息。
我错过了配置文件吗?
答案 0 :(得分:1)
你应该做些什么;在该模式下,相关ID设置为gatewayId+n
(其中gatewayId
为UUID
和n
增量)。回复容器消息选择器设置为JMSCorrelationID LIKE gatewayId%
,因此步骤执行结果应正确路由回主服务器。我建议你打开DEBUG
日志记录并按照双方的消息来查看正在发生的事情。
修改强>
Re:共享JMS端点(下面的评论)。
可以做到,但需要进行一些重组。
在生产者(主)方面,网关和独立聚合器必须移动到父上下文(每个作业上下文都是它的子级)。由于分区处理程序必须位于子上下文中,因此您需要一个单独的聚合器类;也就是说,聚合与分区正交,为方便起见,它只是在那个bean中。公共聚合器很好,因为它使用分区处理程序的相关ID来执行作业,重组的步骤执行结果将被路由到正确的分区处理程序。
消费者(奴隶)方面有点棘手,因为如果入站网关在单个(父)上下文中),它将无法看到子上下文中的stepExecutionRequestHandler
s'通道;您需要构建路由器以将请求路由到适当的作业上下文。并非不可能,只需要多做一点工作。
dynamic-ftp Spring Integration sample及其README是一个很好的起点。