1

STSが提供するSimple Spring Batch ProjectでSpring Batchを試してみました。Spring のスケジューリング機能を追加し、メタデータの保存に PostgreSQL を使用しました。

以下に示すように、単純な構成と ItemReader と ItemWriter の実装例を使用します。ジョブは 15 秒ごとに実行されるように定義されています。最初の反復ではすべてがうまく機能しますが、その後の反復では読み取りと書き込みがスキップされているようです。

ジョブ構成は次のとおりです。

<batch:job id="job1">
    <batch:step id="step1">
        <batch:tasklet start-limit="100" transaction-manager="transactionManager">
            <batch:chunk reader="reader" writer="writer"
                commit-interval="1" />
        </batch:tasklet>
    </batch:step>
</batch:job>

<!-- Run every 15 seconds -->
<task:scheduled-tasks>
    <task:scheduled ref="testTask" method="run"
        cron="*/15 * * * * *" />
</task:scheduled-tasks>

そこに私のリーダーとライターが表示されます。

@Component("reader")
public class ExampleItemReader implements ItemReader<String> {

    private String[] input = {"Hello world!","Wow!", "Thats","cool!",null};
    private int index = 0;

    public String read() throws Exception {
        if (index < input.length) {
            return input[index++];
        }
        else {
            return null;
        }
     }
}

@Component("writer")
public class ExampleItemWriter implements ItemWriter<Object> {

     public void write(List<? extends Object> data) throws Exception {
           System.out.println("data: " + data);
     }
}

これは反復 1 と 2 のコンソール出力です。

<Job: [FlowJob: [name=job1]] launched with the following parameters: [{date=Fri Dec 20 17:00:15 CET 2013}]>
<Job execution starting: JobExecution: id=18, version=0, startTime=null, endTime=null, lastUpdated=Fri Dec 20 17:00:15 CET 2013, status=STARTING, exitStatus=exitCode=UNKNOWN;exitDescription=, job=[JobInstance: id=18, version=0,JobParameters=[{date=Fri Dec 20 17:00:15 CET 2013}], Job=[job1]]>
<Resuming state=job1.step1 with status=UNKNOWN>
<Handling state=job1.step1>
<Executing step: [step1]>
<Executing: id=18>
<Starting repeat context.>
<Repeat operation about to start at count=1>
<Preparing chunk execution for StepContext: org.springframework.batch.core.scope.context.StepContext@33f487e7>
<Chunk execution starting: queue size=0>
<Starting repeat context.>
<Repeat operation about to start at count=1>
<Repeat is complete according to policy and result value.>
<[Hello world!]>
<Inputs not busy, ended: false>
<Applying contribution: [StepContribution: read=1, written=1, filtered=0, readSkips=0, writeSkips=0, processSkips=0, exitStatus=EXECUTING]>
<Saving step execution before commit: StepExecution: id=18, version=1, name=step1, status=STARTED, exitStatus=EXECUTING, readCount=1, filterCount=0, writeCount=1 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0, exitDescription=>


... output of other chunks ommitted ...


<Repeat is complete according to policy and result value.>
<Step execution success: id=18>
<Step execution complete: StepExecution: id=18, version=7, name=step1, status=COMPLETED, exitStatus=COMPLETED, readCount=4, filterCount=0, writeCount=4 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=5, rollbackCount=0>
<Completed state=job1.step1 with status=COMPLETED>
<Handling state=job1.end1>
<Completed state=job1.end1 with status=COMPLETED>
<Job execution complete: JobExecution: id=18, version=1, startTime=Fri Dec 20 17:00:15 CET 2013, endTime=null, lastUpdated=Fri Dec 20 17:00:15 CET 2013, status=COMPLETED, exitStatus=exitCode=COMPLETED;exitDescription=, job=[JobInstance: id=18, version=0, JobParameters=[{date=Fri Dec 20 17:00:15 CET 2013}], Job=[job1]]>
<Job: [FlowJob: [name=job1]] completed with the following parameters: [{date=Fri Dec 20 17:00:15 CET 2013}] and the following status: [COMPLETED]>
Exit Status : COMPLETED

これまでのところ、何がその動作を引き起こす可能性があるのか​​ わかりません。どの反復でも読み取りと書き込みを行うにはどうすればよいか、どなたか教えていただければ幸いです。

前もって感謝します!

痛む指

4

1 に答える 1

3

あなたのリーダーはシングルトンですが、そうあるべきです@Scope("step")。以降の実行では、if (index < input.length)条件は常に false になります。

于 2013-12-20T19:03:39.127 に答える