春季批次 |如何在作业开始时不创建输出文件?

问题描述 投票:0回答:1

我们有一个批处理作业来检查数据库数据。如果数据有任何问题,它将向输出文件写入一些内容。换句话说,它什么也不写。 但是,无论有没有问题,都会创建输出文件。 我们希望它在日期合适时不创建输出文件。

这里是我们的 xml.

<batch:job id="DEFAULT_JOB_ID">
    <batch:step id="step">
        <batch:tasklet transaction-manager="transactionManager" start-limit="100">
            <batch:chunk reader="dbReader01" processor="testProc" writer="classifierWriter01" commit-interval="100" >
                <batch:streams>
                    <batch:stream ref="fileWriter01"/>
                </batch:streams>
            </batch:chunk>
            <batch:listeners>
                <batch:listener ref="defaultChunkListener" />
            </batch:listeners>
        </batch:tasklet>
    </batch:step>
    <batch:listeners>
        <batch:listener ref="defaultJobExecutionListener" />
    </batch:listeners>
</batch:job>

<bean id="classifierWriter01" class="org.springframework.batch.item.support.ClassifierCompositeItemWriter" scope="step">
    <property name="classifier">
        <bean class="org.springframework.classify.BackToBackPatternClassifier">
            <property name="routerDelegate">
                <bean class="src.test.DefaultClassifier" />
            </property>
            <property name="matcherMap">
                <util:map id="matcherMap" scope="step">
                    <!-- FLAG == 0 THEN write something -->
                    <entry key="0" value-ref="fileWriter01" />
                    <!-- FLAG == 1 THEN write nothing -->
                    <entry key="1" value-ref="dummyWriter" />
                </util:map>
            </property>
        </bean>
    </property>
</bean>

<bean id="fileWriter01" class="org.springframework.batch.item.file.FlatFileItemWriter"   scope="step">
    <property name="encoding" value="UTF-8" />
    <property name="resource" value="file:#{jobParameters['outFile']}" />
    <property name="appendAllowed" value="false"/>
    <property name="shouldDeleteIfExists" value="true"/>
    <property name="lineAggregator">
        <bean class="src.test.DelimitedLineAggregator">
            <property name="delimiter" value="," />
            <property name="allEnclosing" value="true" />
            <property name="enclosure" value='"' />
            <property name="fieldExtractor">
                <bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor" >
                    <property name="names"
                        value="seq,errCode,errMsg" />
                </bean>
            </property>
        </bean>
    </property>
</bean>
        
<bean id="dummyWriter" class="src.test.DummyItemWriter" scope="step"/>

问题是当我们使用FlatFileItemWriter时,我们必须使用batch:streams创建outfile。但是如果我们使用batch:streams,outFile将在作业开始时创建。

如果我们不使用 batch:streams,它会抛出这个错误日志

org.springframework.batch.item.WriterNotOpenException: Writer must be open before it can be written to

itemWriter不能自己创建文件吗?

spring stream spring-batch
1个回答
0
投票

您可以使用专为此用例设计的FlatFileItemWriter

shouldDeleteIfEmpty
参数。

© www.soinside.com 2019 - 2024. All rights reserved.