【发布时间】:2014-01-22 18:30:25
【问题描述】:
我是 Spring 新手。我有一个工作,它读取文件并写入数据库。如果文件中的记录数超过 8000,我不应该处理文件并且应该停止作业执行。请提出更好的方法。
【问题讨论】:
-
我正在尝试实现条件步骤,但不确定如何在代码中进行配置。
标签: java spring spring-batch
我是 Spring 新手。我有一个工作,它读取文件并写入数据库。如果文件中的记录数超过 8000,我不应该处理文件并且应该停止作业执行。请提出更好的方法。
【问题讨论】:
标签: java spring spring-batch
您可以在 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) {
}
}
【讨论】:
JobExecutionDecider 后检查是否需要继续或完成作业(这应该使工作流程更清晰)
不是特定于 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();
}
这比仅仅读取文件和计数更有效。
【讨论】:
我假设您文件中的记录不是固定长度的。如果是这样,File.length() 将轻松计算文件中的记录数。
如果不是,它需要正好是 8000 还是大约 8000?如果这是一个粗略的限制,我会得到这些文件的平均记录长度,然后使用 File.length() 来估计记录数。
【讨论】: