Spring Batch~动态提交间隔或自定义完成策略

时间:2014-09-25 14:46:55

标签: spring csv spring-batch

我有什么?

Spring Integration,递归观看新CSV文件的文件夹;并将它们发回Spring批次。

作业:阅读CSV文件;在处理器中,我修改了项目中的一些数据;然后我使用自定义编写器将数据保存在数据库中。

问题吗

事实上,我有动态数量的CSV beeing发送到批处理。我希望我的作业提交间隔将基于CSV文件中存在的项目(行)数量。换句话说,我不想在每个固定数量的项目中提交我的数据,而是在文件的每一端。例如:CSV 1有200行,我想处理所有行,写入,提交,关闭事务然后读取下一个CSV。

我有两个想法,但我不知道哪个是完美的,如何实现它:

  1. 从读卡器中获取CSV中的行数,并使用作业参数参数将其发送到我的提交间隔,如#{jobParameters['commit.interval.value']}
  2. 实施自定义完成策略以替换我的提交内容,如何实现isComplete()您是否有任何例子? Github项目?
  3. 但在此之前,我怎样才能获得物品数量?

    任何人都可以帮助我吗?代码样本可能吗?

    提前谢谢。

1 个答案:

答案 0 :(得分:3)

没有答案,但我找到了解决方案

我正在使用动态提交间隔而不是完成政策。

使用Spring批量集成,我可以使用转换器将我的文件发送到批处理,因为我有一个自定义类FileMessageToJobRequest,我添加了这个函数,帮助我获取计数行

public static int countLines(String filename) throws IOException {
    InputStream is = new BufferedInputStream(new FileInputStream(filename));
    try {
        byte[] c = new byte[1024];
        int count = 0;
        int readChars = 0;
        boolean empty = true;
        while ((readChars = is.read(c)) != -1) {
            empty = false;
            for (int i = 0; i < readChars; ++i) {
                if (c[i] == '\n') {
                    ++count;
                }
            }
        }
        return (count == 0 && !empty) ? 1 : count;
    } finally {
        is.close();
    }
}

和这一个发送参数

@Transformer
public JobLaunchRequest toRequest(Message<File> message) throws IOException{

    JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();

    jobParametersBuilder.addString("commit.interval", Integer.toString(countLines(message.getPayload().getAbsolutePath())));

    return new JobLaunchRequest(job, jobParametersBuilder.toJobParameters());
}

在我的工作环境中,我刚刚添加了这个commit-interval="#{jobParameters['commit.interval']}"

希望它可以帮助有需要的人;)