Spring Batch暂停然后继续

时间:2015-03-31 15:31:06

标签: spring-batch

我正在编写一个将从excel文件中读取的作业,x行数,然后我希望它在继续下一个x行之前暂停一小时。 我该怎么做?

我有一个包含以下内容的job.xml文件。 subscriptionDiscoverer获取文件并将其传递给处理器。在处理完成后,subscriptionWriter应该写另一个文件。

<job id="subscriptionJob" xmlns="http://www.springframework.org/schema/batch" incrementer="jobParamsIncrementer">
    <validator ref="jobParamsValidator"/>
    <step id="readFile">
        <tasklet>
            <chunk reader="subscriptionDiscoverer" processor="subscriptionProcessor" writer="subscriptionWriter" commit-interval="1"  />
        </tasklet>
    </step>
</job>

我可以使用某种计时器,还是某种流动结构?它是一个大约160000行的大文件,应该被处理。

我希望有人有他们想要分享的解决方案。 谢谢!

1 个答案:

答案 0 :(得分:2)

我想到了两种可能的方法:

  1. 停止作业,然后在最后一个位置重新开始(一小时后)。您可以先了解如何更改BatchStatus以通知您停止作业的意图。请参阅http://docs.spring.io/spring-batch/2.0.x/cases/pause.html或查看Spring Batch Admin如何实现其传递PAUSE标志(http://docs.spring.io/spring-batch-admin/reference/reference.xhtml)的方式。您可能需要实现一些持久性来存储作业的位置(行号),以便知道再次开始处理的位置。您也可以使用调度程序重新启动作业。
  2. -OR -

    1. 添加ChunkListener并在afterChunk(ChunkContext上下文)中实现以下内容:检查到目前为止是否已读取x行数,如果是,则实现暂停机制(例如,简单的Thread.sleep或寻找更一致的暂停步骤的方式)。要检查读取的行数,可以使用ChunkContext.getStepContext()中的StepExecution.getReadCount()。StepExecution()。
    2. 请注意,在事务之外调用afterChunk,如javadoc中所示:

        

      在事务之外执行块之后的回调。