(Spring批处理)带有回复的可轮询通道包含ChunkResponses,即使JOB成功完成也是如此

时间:2016-01-05 21:52:56

标签: spring spring-integration spring-batch

我有以下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队列通道,但我不确定它是否正确...

你能澄清一下吗?

2 个答案:

答案 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。

我也错误地配置了远程分步......我的错。

我还没有在多个节点上测试它,但现在我认为它的工作原理应该如此。

非常感谢您的帮助。

问候

托马斯