我有一个要求,我必须阅读一个不断变化的平面文本文件。让我们假设我有一个100行的文件,我在批处理中使用FlatFileReader读取并处理这些行。再次当该步骤被调用时,让我们说在30秒之后,那么有110行。在这种情况下,批次应该从第101行读取。 我知道有些线路可以使用Tokkip' Reader中的参数但我可以在批处理的开头只定义它而不是动态的。此外,我在批处理配置中定义的文件应该在调用该步骤时再次重新加载(步骤将是连续的过程)。
对此有何想法?
由于 尼拉吉
答案 0 :(得分:1)
我建议采用以下方法:
用听众包裹你的读者,并在钩子之前和之后使用 确保步骤和FlatFileItemReader bean都在步骤范围中定义。
您的听众看起来与下面的听众类似
@Component
public class LineCursorListener implements StepListener {
@BeforeStep
public ExitStatus beforeStep(StepExecution stepExecution){
int curser = 0;//read from persistence
stepExecution.getExecutionContext().put("linesToSkip", curser);
return stepExecution.getExitStatus();
}
@AfterStep
public ExitStatus afterStep(StepExecution stepExecution){
int nextCurser= stepExecution.getWriteCount() + stepExecution.getSkipCount();
nextCurser =nextCurser + stepExecution.getExecutionContext().getInt("linesToSkip");
// persistence the nextCurser
return stepExecution.getExitStatus();
}
}
您的工作xml将类似于
<batch:job>
...
<batch:step id="processCsv">
<batch:tasklet transaction-manager="transactionManager">
<batch:chunk reader="someFileReader"
writer="writter" commit-interval="10" />
</batch:tasklet>
<batch:listeners>
<batch:listener ref="lineCurserListener" />
</batch:listeners>
</batch:job>
<bean id="someFileReader" scope="step"
class="org.springframework.batch.item.file.FlatFileItemReader" >
...
<property name="linesToSkip" value="#{stepExecutionContext['linesToSkip']}" />
<property name="lineMapper">
...
</property>
</bean>
我只是提出了这个问题的Spring批处理观点,我想你需要注意与文件读/写相关的并发问题