spring batch:读取连续变化的平面文件

时间:2014-06-20 09:26:36

标签: dynamic spring-batch filereader

我有一个要求,我必须阅读一个不断变化的平面文本文件。让我们假设我有一个100行的文件,我在批处理中使用FlatFileReader读取并处理这些行。再次当该步骤被调用时,让我们说在30秒之后,那么有110行。在这种情况下,批次应该从第101行读取。 我知道有些线路可以使用Tokkip' Reader中的参数但我可以在批处理的开头只定义它而不是动态的。此外,我在批处理配置中定义的文件应该在调用该步骤时再次重新加载(步骤将是连续的过程)。

对此有何想法?

由于 尼拉吉

1 个答案:

答案 0 :(得分:1)

我建议采用以下方法:

用听众包裹你的读者,并在钩子之前和之后使用 确保步骤和FlatFileItemReader bean都在步骤范围中定义

  • 在前一步骤中,从一些持久性(文件/ db / etc)中读取最后一行处理的计数,并将其放在stepExecutionContext上。
  • 使用stepExecutionContext上的值,使用spel
  • 在FlatFileItemReader中设置linesToSkip
  • 在后续步骤中,从执行上下文中获取当前WriteCount和SkipCount,并将其与前一步骤中的值相加。保留此值以便下次执行

您的听众看起来与下面的听众类似

@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批处理观点,我想你需要注意与文件读/写相关的并发问题