SPRING BATCH:如何为在任务执行程序中运行的多个作业配置远程分块

时间:2016-05-19 19:06:15

标签: java spring spring-integration spring-batch horizontal-scaling

我是春季批量处理的新手。我正在使用远程分块,其中有一个主服务器,多个从服务器和用于消息传递的ActiveMQ。

Master有一个工作和一个工作启动器,工作启动器有一个任务执行器,它具有以下配置
      的 <task:executor id="batchJobExecutor" pool-size="2"queue-capacity="100" /> 即可。
块配置是

<bean id="chunkWriter"
    class="org.springframework.batch.integration.chunk.ChunkMessageChannelItemWriter" scope="step">
    <property name="messagingOperations" ref="messagingGateway" />
    <property name="replyChannel" ref="replies" />
    <property name="throttleLimit" value="50" />
    <property name="maxWaitTimeouts" value="60000" />
</bean>

<bean id="chunkHandler"
    class="org.springframework.batch.integration.chunk.RemoteChunkHandlerFactoryBean">
    <property name="chunkWriter" ref="chunkWriter" />
    <property name="step" ref="someJobId" />
</bean>

<integration:service-activator
    input-channel="requests" output-channel="replies" ref="chunkHandler" />

因此,我们可以一次运行两个作业,其余作业将在队列中 当提交两个作业时,Master正在创建块并提交到队列,并且正在处理从属。

但从奴隶到主人的确认是错误的

java.lang.IllegalStateException: Message contained wrong job instance id [9331] should have been [9332].
at org.springframework.util.Assert.state(Assert.java:385) ~[Assert.class:4.1.6.RELEASE]
at org.springframework.batch.integration.chunk.ChunkMessageChannelItemWriter.getNextResult    

请帮助我。

2 个答案:

答案 0 :(得分:0)

ChunkMessageChannelItemWriter仅针对一个并发步骤设计 - 您需要将其放在步骤范围内,以便每个作业都有自己的实例 - see this test case

修改

实际上,没有;这将无法工作 - 因为bean实例使用相同的回复通道,他们可以得到彼此的回复。我打开了JIRA Issue

答案 1 :(得分:-1)

这是一篇非常古老的帖子,但我认为您在此处看到的问题可能与节流限制大于$ ls -lf | sort -t_ -k3n | tail -5 maxWaitTimouts有关。

我们看到的是,在作业完成后,实现将不会从回复队列中读取超过4个条目。我认为这是一个错误。

另请参阅我在stackoverflow上询问的问题:Remote batch job does not read all responses in afterStep method

我也为此做了一个错误报告:https://jira.spring.io/browse/BATCH-2651我正在创建一个公关来解决这个问题。