1

我有一个配置如下的项目编写器,它生成一个 xml:

<beans:bean id="delegateItemWriter" class="org.springframework.batch.item.xml.StaxEventItemWriter" scope="step">
    <beans:property name="resource" value="file:#{jobParameters['OutputDirPath']}${myFileName}" /> 
    <beans:property name="overwriteOutput" value="true"/>
    <beans:property name="rootTagName" value="disclosure-feed" />
    <beans:property name="rootElementAttributes" >
        <beans:map>
            <beans:entry key="xmlns:xsi" value="http://www.w3.org/2001/XMLSchema-instance" />               
            <beans:entry key="xsi:noNamespaceSchemaLocation" value="XYZ.xsd"/>
        </beans:map>
    </beans:property>
    <beans:property name="marshaller" ref="xmlMarshaller" />  
</beans:bean>

即使每件事看起来都是正确的,有时在修复先前运行失败后重新启动作业时,我会收到以下错误:

2013-07-19 02:14:34,921 [main] ERROR org.springframework.batch.core.step.AbstractStep  - Encountered an error executing the step
org.springframework.batch.item.ItemStreamException: File is not writable: [/myOutputDir/myOutput.xml]

当我从 batch_ 表中手动删除作业条目以便作业从头开始而不是从上次运行期间失败的位置重新开始时,文件会按预期生成。

这个问题的原因是什么?如何解决?是否有一些我缺少的配置内容?

谢谢阅读!

4

3 回答 3

3

看起来像 org.springframework.batch.item.utilFileUtils.java 中的一个错误,Spring 批处理期待在第一次运行时已经创建的文件。

   if (!restarted) {
                if (file.exists()) {
                   ...
                }
                if (file.getParent() != null) {
                    new File(file.getParent()).mkdirs();
                }
                file.createNewFile();
   }

   if (!file.canWrite()) {
            throw new ItemStreamException("File is not writable...");
   }

如果是重新启动,则不会创建任何文件,因此您会遇到异常。

于 2014-11-04T07:16:33.620 回答
0

我遇到了同样的问题。我在 Java Config 类中创建了一个新文件来解决这个问题。现在每当执行 Job 时,在初始化配置时都会创建一个新文件。因此,在重新启动时,文件也已经创建。

FlatFileItemWriter<List<String>>  flatFileWriter= new FlatFileItemWriter<>();
DelimitedLineAggregator<List<String>> delimitedLineAggregator = new DelimitedLineAggregator<>();
delimitedLineAggregator.setDelimiter(System.lineSeparator());
Resource res = new FileSystemResource(file);
res.getFile().createNewFile();
flatFileWriter.setResource(res);

在为我的用例创建新文件时,我没有看到任何问题。

于 2018-08-07T15:52:52.210 回答
-1

请在定义作业时调用 jobBuilderFactory 上的 preventRestart() 方法。每次作业运行时,restart 属性都是 true。因此,它期望文件存在。

于 2018-05-09T17:42:46.533 回答