1

我是春季批处理的新手。我正在使用远程分块,其中有一个 master ,多个 slave 和 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 正在创建块并提交到队列,slave 正在处理。

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

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    

请帮我解决一下这个。

4

2 回答 2

0

ChunkMessageChannelItemWriter仅针对一个并发步骤而设计-您需要将其放在步骤范围内,以便每个作业都有自己的实例-请参阅此测试用例

编辑

实际上,没有;那是行不通的——因为 bean 实例使用相同的回复通道,它们可以得到彼此的回复。我打开了一个JIRA 问题

于 2016-05-19T22:05:52.943 回答
-1

这是一篇很老的帖子,但我认为您在此处看到的问题可能与油门限制大于maxWaitTimouts值有关4

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

另请参阅我在 stackoverflow 上提出的问题:远程批处理作业不会读取 afterStep 方法中的所有响应

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

于 2017-11-12T12:57:06.477 回答