我的问题是我不了解各种弹簧批处理上下文。参考文档说明了如何将数据传递到将来的步骤。但是如何在一个步骤中在读取器和编写器组件之间传递数据。步骤上下文。有没有块背景? 我之前在编写分区程序时已经在执行上下文之前使用过。但那些是并行执行的。
我现在需要做一个有序的操作。它基本上是一个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>
答案 0 :(得分:0)
如果下一次调用CompletionPolicy
返回{,则可以编写自己的itemReader
前瞻PeekableItemReader
(使用itemReader.next()
)并将当前块返回为“已完成” {1}}(表示当前文件的EOF)
请记住:由于完整的内存中文件内容读取,此解决方案可能会导致内存问题。
null