我有以下chunk writer配置来获取spring batch remote chunking的回复:
<bean id="chunkWriter" class="org.springframework.batch.integration.chunk.ChunkMessageChannelItemWriter" scope="step">
<property name="messagingOperations" ref="messagingGateway" />
<property name="replyChannel" ref="masterChunkReplies" />
<property name="throttleLimit" value="5" />
<property name="maxWaitTimeouts" value="30000" />
</bean>
<bean id="messagingGateway" class="org.springframework.integration.core.MessagingTemplate">
<property name="defaultChannel" ref="masterChunkRequests" />
<property name="receiveTimeout" value="2000" />
</bean>
<!-- Remote Chunking Replies From Slave -->
<jms:inbound-channel-adapter id="masterJMSReplies"
destination="remoteChunkingRepliesQueue"
connection-factory="remoteChunkingConnectionFactory"
channel="masterChunkReplies">
<int:poller fixed-delay="10" />
</jms:inbound-channel-adapter>
<int:channel id="masterChunkReplies">
<int:queue />
<int:interceptors>
<int:wire-tap channel="loggingChannel"/>
</int:interceptors>
</int:channel>
我的远程分块步骤运行正常,所有数据都以非常好的性能处理,所有步骤都以COMPLETED状态结束。但问题是masterChunkReplies队列通道在作业结束后包含ChunkResponses。文档没有说什么,是正常状态吗?
问题是我当时无法开展新工作,因为它随后崩溃了:
Message contained wrong job instance id ["
+ jobInstanceId + "] should have been [" + localState.getJobId() + "]."
有一个简单的解决方法,在作业开始时清理masterChunkReplies队列通道,但我不确定它是否正确...
你能澄清一下吗?
答案 0 :(得分:1)
加里,我找到了根本原因。
在slave,如果我更改了以下chunk使用者JMS适配器:
<jms:message-driven-channel-adapter id="slaveRequests"
connection-factory="remoteChunkingConnectionFactory"
destination="remoteChunkingRequestsQueue"
channel="chunkRequests"
concurrent-consumers="10"
max-concurrent-consumers="50"
acknowledge="transacted"
receive-timeout="5000"
idle-task-execution-limit="10"
idle-consumer-limit="5"
/>
代表
<jms:inbound-channel-adapter id="jmsRequests" connection-factory="remoteChunkingConnectionFactory"
destination="remoteChunkingRequestsQueue"
channel="chunkRequests"
acknowledge="transacted"
receive-timeout="5000"
>
<int:poller fixed-delay="100"/>
</jms:inbound-channel-adapter>
然后它工作, masterChunkReplies 队列在作业结束时完全消耗。无论如何,任何在parallalel中奴隶消费chunkRequests的尝试都不起作用。然后,MasterChunkReplies队列包含未消耗的ChunkResponses。因此,开始新的工作以
结束Message contained wrong job instance id ["
+ jobInstanceId + "] should have been [" + localState.getJobId() + "]."
Gary,这是否意味着奴隶不能并行使用ChunkRequests?
答案 1 :(得分:1)
Gary,经过几天的努力,我终于完成了工作,......即使并行的ChunkRequests在奴隶消耗,并且在作业结束时使用空的masterChunkReplies可轮询频道......更改:
在master中,我更改了轮询的入站通道适配器消耗刚从github示例中获取的ChunkResponses,因为消息驱动的适配器具有与从属服务器消耗ChunkRequests相同级别的多线程。因为我觉得主人正在慢慢地消耗ChunkResponses,这就是为什么在工作结束时还有额外的ChunkResponses。
我也错误地配置了远程分步......我的错。
我还没有在多个节点上测试它,但现在我认为它的工作原理应该如此。
非常感谢您的帮助。
问候
托马斯