扩展CompletionPolicy以从MultiResourceItemReader完成/提交每个资源

时间:2015-04-15 16:13:31

标签: spring-batch

我的问题是我不了解各种弹簧批处理上下文。参考文档说明了如何将数据传递到将来的步骤。但是如何在一个步骤中在读取器和编写器组件之间传递数据。步骤上下文。有没有块背景? 我之前在编写分区程序时已经在执行上下文之前使用过。但那些是并行执行的。

我现在需要做一个有序的操作。它基本上是一个jdbc导入作业,但每个文件都需要按顺序提交,否则它们是外键约束意志。

我能够获取单个文件资源的行数的最简单的地方是在MultiResourceItemReader中委托给ItemReader之前。但是看了各种CompletionPolicy实现后,他们似乎只能访问RepeatContext。如何在MultiResourceItemReader的RepeatContext中存储一个值,以便我的CompletionPolicy可以访问它并在特定文件资源行计数后提交。

如何扩展抽象CountingCompletionPolicy以及如何从MultiResourceItemReader存储数据的示例将会很有帮助。

或者也许有更好的方法来评估这类工作。

<!-- <job id="job" restartable="${restartable}" xmlns="http://www.springframework.org/schema/batch"> -->
    <batch:job id="job" restartable="true"
        xmlns="http://www.springframework.org/schema/batch">
        <batch:step id="step1-unzipFile">
            <batch:tasklet ref="unzipFileTasklet" />
            <batch:next on="COMPLETED" to="step2-import" />
        </batch:step>
        <batch:step id="step2-import"> <!-- we can't use a commit-interval="${commitInterval} cause it messes with 2nd pass import processing if the commit ends up being the middle of the file -->
            <batch:tasklet>
                <batch:chunk reader="multiResourceReader" writer="itemWriter" chunk-completion-policy="completionPolicy"/>  
            </batch:tasklet>
            <!-- <batch:next on="COMPLETED" to="step3-fileCleanUp" /> -->
        </batch:step>
        <!-- <batch:step id="step3-fileCleanUp">
            <batch:tasklet ref="fileCleanUpTasklet" />
        </batch:step> -->
    </batch:job>




    <bean id="multiResourceReader" class="springbatch.iimport.extended.SequentialLoaderMultiFileResourceItemReader" scope="step">
        <property name="resourceDirectoryPath" value="${importTempDirectoryBasePath}/#{jobParameters['jobKey']}/"/>
        <property name="delegate" ref="itemReader"/>
    </bean>

    <bean id="itemReader" class="org.springframework.batch.item.file.FlatFileItemReader">
        <property name="lineMapper" ref="lineMapper" />
    </bean>

    <bean id="lineMapper" class="springbatch.iimport.extended.JsonToTupleLineMapper"/>

    <bean id="itemWriter" class="springbatch.iimport.extended.TupleJdbcBatchItemWriter" scope="step">
        <property name="moduleDataSource" ref="moduleDataSource"/>
        <property name="dataSource" ref="dataSource"/>
        <property name="jobKey" value="#{jobParameters['jobKey']}"/>
        <property name="jobDef" value="#{jobParameters['jobDef']}"/>
    </bean>

    <bean id="completionPolicy" class="?"/> 

    <!-- tasklets -->

    <bean id="unzipFileTasklet" class="springbatch.iimport.tasklets.UnZipFile" scope="step">
        <!-- the temp directory the files are unzipped to end up being #{jobParameters['importZipFileName']} -->
        <property name="importZipFileName" value="${uploadDir}/#{jobParameters['importZipFileName']}" />
        <property name="jobKey" value="#{jobParameters['jobKey']}"/>
        <property name="importTempDirectoryBasePath" value="${importTempDirectoryBasePath}" />
     </bean>

1 个答案:

答案 0 :(得分:0)

如果下一次调用CompletionPolicy返回{,则可以编写自己的itemReader前瞻PeekableItemReader(使用itemReader.next())并将当前块返回为“已完成” {1}}(表示当前文件的EOF) 请记住:由于完整的内存中文件内容读取,此解决方案可能会导致内存问题。

null