Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring flatfileitemwriter将在重新启动作业之前覆盖这些行_Spring_Csv_Spring Batch - Fatal编程技术网

Spring flatfileitemwriter将在重新启动作业之前覆盖这些行

Spring flatfileitemwriter将在重新启动作业之前覆盖这些行,spring,csv,spring-batch,Spring,Csv,Spring Batch,正如标题所说,我使用flatfileitemwriter将数据写入csv,当作业正常完成时,它运行成功。 但是我在测试“重试”函数时遇到了一些问题 作业配置如下所示 <batch:tasklet transaction-manager="resourcelessTransactionManager"> <batch:chunk reader="myreader" processor="myprocessor" writer="itemWriter" c

正如标题所说,我使用flatfileitemwriter将数据写入csv,当作业正常完成时,它运行成功。 但是我在测试“重试”函数时遇到了一些问题

作业配置如下所示

<batch:tasklet transaction-manager="resourcelessTransactionManager">
            <batch:chunk reader="myreader" processor="myprocessor" writer="itemWriter"  commit-interval="40" />
        </batch:tasklet>


<bean id="itemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
    <property name="resource" value="file:C:\\xx\\my.csv" />
    <property name="lineAggregator">
        <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
            <property name="fieldExtractor">
                <bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
                    <property name="names" value="a,b,c,d" />
                </bean>
            </property>
        </bean>
    </property>
    <property name="forceSync" value="true" />
</bean>
总共有300条记录需要处理。 我运行的步骤如下所示

<batch:tasklet transaction-manager="resourcelessTransactionManager">
            <batch:chunk reader="myreader" processor="myprocessor" writer="itemWriter"  commit-interval="40" />
        </batch:tasklet>


<bean id="itemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
    <property name="resource" value="file:C:\\xx\\my.csv" />
    <property name="lineAggregator">
        <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
            <property name="fieldExtractor">
                <bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
                    <property name="names" value="a,b,c,d" />
                </bean>
            </property>
        </bean>
    </property>
    <property name="forceSync" value="true" />
</bean>
  • 当我第一次运行它时,它会将前0-99条记录写入csv,并引发预期的异常

  • 当我第二次运行它时,它会将前100-199条记录写入csv,并抛出预期的异常。但89-99的记录被推翻了

  • 第三次,就像第二次一样,175-199被推翻了


  • 我的代码或配置有问题吗?具有nio文件通道的position writer不应该这样工作。如何修复它?

    阅读下面的内容如何。在那里,您将看到一个属性
    append
    ,其默认值为
    false
    。。。现在想象一下,如果您将其切换为
    true
    ,可能会发生什么。如果我对任何作业实例使用不同的文件,Append可以修复它,但它没有解决我的问题,因为它是由错误位置计算引起的。它太神奇了,它没有在家中重新出现(Jdk8),唯一不同的是JDK版本,一个是7,任何其他文件都是8。只有在使用同一文件时,Ehrm append才会起作用。如果您为每个作业实例使用不同的文件(假设您指的是Spring Batch中的作业实例内容),则根本没有意义。Append不起作用,因为文件通道的光标已恢复到wirte(列表)之前方法doOpen()上的错误位置。但是谢谢你。