如何计算 ItemReader 中的 stepReads 以使中间结果可用,即使 step 仍然是 运行?
How to count stepReads in ItemReader to make intermediate result available even if step is still running?
我的XML步骤声明
<step id="MongoDbLoadDataStep" next="checkStatusStep">
<tasklet>
<chunk reader="MongoReader" writer="MongoWriter" commit-interval="5"/>
</tasklet>
</step>
A reader 只有一种方法 read
并且没有机会增加读取计数器或访问 Spring StepContribution
实例。所以我需要找到一种方法来提供一种机制,使我能够增加步进读数计数器。在Tasklet
中我们有非常方便的方法:
RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext)
但是在 XML 中只有默认的 Tasklet 由 Spring 内部管理。任何想法我该怎么做?
PS
无法修改XML批量配置
您可以实现 ItemReadListener 以在每次读取后递增计数器。和一个 StepExecutionListener 将结果存储在上下文中(省略空方法):
public class ItemReadCountListener implements ItemReadListener<T>, StepExecutionListener {
private Integer count = 0;
@Override
public void afterRead(T item) {
count++; // Increment counter
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
stepExecution.getJobExecution().getExecutionContext().put("ITEM_READ_COUNT", count); // Store counter
}
}
将其添加到您的块中:
<batch:chunk>
<batch:listeners merge="true">
<batch:listener>
<bean class="xx.xx.xx.ItemReadCountListener" />
</batch:listener>
</batch:listeners>
</batch:chunk>
我的XML步骤声明
<step id="MongoDbLoadDataStep" next="checkStatusStep">
<tasklet>
<chunk reader="MongoReader" writer="MongoWriter" commit-interval="5"/>
</tasklet>
</step>
A reader 只有一种方法 read
并且没有机会增加读取计数器或访问 Spring StepContribution
实例。所以我需要找到一种方法来提供一种机制,使我能够增加步进读数计数器。在Tasklet
中我们有非常方便的方法:
RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext)
但是在 XML 中只有默认的 Tasklet 由 Spring 内部管理。任何想法我该怎么做?
PS
无法修改XML批量配置
您可以实现 ItemReadListener 以在每次读取后递增计数器。和一个 StepExecutionListener 将结果存储在上下文中(省略空方法):
public class ItemReadCountListener implements ItemReadListener<T>, StepExecutionListener {
private Integer count = 0;
@Override
public void afterRead(T item) {
count++; // Increment counter
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
stepExecution.getJobExecution().getExecutionContext().put("ITEM_READ_COUNT", count); // Store counter
}
}
将其添加到您的块中:
<batch:chunk>
<batch:listeners merge="true">
<batch:listener>
<bean class="xx.xx.xx.ItemReadCountListener" />
</batch:listener>
</batch:listeners>
</batch:chunk>