【问题标题】:spring batch : Read flat file which is getting changed continouslyspring batch:读取不断变化的平面文件
【发布时间】:2014-06-20 09:26:36
【问题描述】:

我有一个要求,我必须阅读一个不断变化的平面文本文件。假设我有一个包含 100 行的文件,我使用 FlatFileReader 批量读取并处理这些行。再次调用该步骤时,假设在 30 秒后,则有 110 行。在这种情况下,该批次应从第 101 行读取。 我知道 Reader 中有“linesToSkip”参数,但我可以在批处理开始时定义它,但不能动态定义。此外,我在批处理配置中定义的文件应在调用该步骤时再次重新加载(步骤将是连续过程)。

对此有什么想法吗?

谢谢 尼拉吉

【问题讨论】:

  • 如何从文件中读取数据后,将其复制(附加)到不同的文件,并清除正在读取的文件。因此,您从中读取的文件将只有新数据。
  • 在下面查看我建议的解决方案

标签: dynamic spring-batch filereader


【解决方案1】:

我会建议以下方法:

用监听器包裹你的阅读器步骤,并使用 before 和 after 钩子。
确保 step 和 FlatFileItemReader bean 都在 step 范围内定义

  • 在前面的步骤中,从某个持久性(文件/db/etc)中读取最后一行处理的计数并将其放在 stepExecutionContext 中。
  • 使用放置在 stepExecutionContext 上的值在 FlatFileItemReader 中使用 spel 设置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 batch的观点,我想你需要注意与文件读/写相关的并发问题

【讨论】:

    猜你喜欢
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多