【问题标题】:How to get number of lines in a file in spring batch in Item reader如何在项目阅读器的春季批处理中获取文件中的行数
【发布时间】:2014-01-22 18:30:25
【问题描述】:

我是 Spring 新手。我有一个工作,它读取文件并写入数据库。如果文件中的记录数超过 8000,我不应该处理文件并且应该停止作业执行。请提出更好的方法。

【问题讨论】:

  • 我正在尝试实现条件步骤,但不确定如何在代码中进行配置。

标签: java spring spring-batch


【解决方案1】:

您可以在 itemreader 上实现 StepExecutionListener。然后你可以得到与你的行号相对应的readcount。

 public class ExampleItemReader implements ItemReader<String>, StepExecutionListener {

    public synchronized String read() throws Exception {
        return "";
    }

    @Override
    public ExitStatus afterStep(StepExecution executionContext) {
        if (executionContext.getReadCount() > 8000) {
            return ExitStatus.COMPLETED;
        }
        return ExitStatus.EXECUTING;
    }

    @Override
    public void beforeStep(StepExecution arg0) {

    }

}

建议阅读spring batch patterns

【讨论】:

  • 这不是 OP 想要的,因为这个解决方案处理文件,并且如果计数 > 8K,OP 想要丢弃所有记录!使用解决方案(没有技巧来更快地计算记录)可能更好地创建上一步,检查 8K 条件(只读取记录,没有写入)并在使用 JobExecutionDecider 后检查是否需要继续或完成作业(这应该使工作流程更清晰)
  • 嗯,你是对的。如果超过 8K 行的文件不需要处理,则上一步会更好。
【解决方案2】:

不是特定于 spring 的东西,但 java.io 中有一个类 LineNumberReader。您可以利用它及其skip 方法来跳过大量字符。

例子:

public int getNoOfLines(String fileName) {
   LineNumberReader reader = new LineNumberReader(new FileReader(fileName));
   reader.skip(Integer.MAX_VALUE); //skips those many chars, if you feel your file size may exceed you can use Long.MAX_VALUE
   return reader.getLineNumber();
}

这比仅仅读取文件和计数更有效。

【讨论】:

  • 感谢您的回答。我正在尝试为我的作业实施父步骤,我将确定行数以及如果父步骤完成后如何停止作业。
  • 如果您可以在父步骤中获取文件,则可以调用上述方法并知道该文件中的行数
【解决方案3】:

我假设您文件中的记录不是固定长度的。如果是这样,File.length() 将轻松计算文件中的记录数。

如果不是,它需要正好是 8000 还是大约 8000?如果这是一个粗略的限制,我会得到这些文件的平均记录长度,然后使用 File.length() 来估计记录数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 2020-08-10
    • 2013-02-04
    • 2014-08-06
    • 1970-01-01
    相关资源
    最近更新 更多