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

Spring批处理~动态提交间隔或自定义完成策略,spring,csv,spring-batch,Spring,Csv,Spring Batch,我有什么? Spring集成,递归监视新CSV文件的文件夹;然后把它们送回Spring batch 作业:读取CSV文件;在处理器中,我修改了项目中的一些数据;然后,我使用一个自定义编写器将数据保存在数据库上 问题? 事实上,我有动态的CSV发送到批。我希望我的作业提交间隔将基于CSV文件中存在的项目(行)数。换句话说,我不想在每个固定数量的项目中提交数据,而是在文件的每个结尾提交数据。示例:CSV1有200行,我想处理所有行,写入它们,提交,关闭事务,然后读取下一个CSV 我有两个想法,但我不

我有什么?

Spring集成,递归监视新CSV文件的文件夹;然后把它们送回Spring batch

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

问题?

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

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

  • 从读取器获取我的CSV中的行数,并使用作业参数参数so
    {jobParameters['commit.interval.value']}
  • 实现自定义完成策略以替换我的提交内部版本,如何实现
    isComplete()
    您有任何示例吗?Github项目
  • 但在所有这些之前,我怎样才能得到物品的数量呢

    有人能帮我吗?可能是代码示例


    提前谢谢。

    没有回答,但我找到了解决办法

    我使用的是动态提交间隔,而不是完成策略

    通过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();
        }
    }
    
    public static int countLines(字符串文件名)引发IOException{
    InputStream is=new BufferedInputStream(new FileInputStream(filename));
    试一试{
    字节[]c=新字节[1024];
    整数计数=0;
    int readChars=0;
    布尔空=真;
    而((readChars=is.read(c))!=-1){
    空=假;
    for(int i=0;i
    这个用来发送参数

    @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());
    }
    
    变压器 public JobLaunchRequest toRequest(消息消息)引发IOException{ JobParametersBuilder JobParametersBuilder=新的JobParametersBuilder(); jobParametersBuilder.addString(“commit.interval”、Integer.toString(countLines(message.getPayload().getAbsolutePath())); 返回新的JobLaunchRequest(job,jobParametersBuilder.toJobParameters()); }
    在我的作业上下文中,我刚刚添加了这个
    commit interval=“#{jobParameters['commit.interval']}”

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