Spring batch 我得到;必须先打开Writer,然后才能将其写入;使用ClassifierCompositeItemWriter时

Spring batch 我得到;必须先打开Writer,然后才能将其写入;使用ClassifierCompositeItemWriter时,spring-batch,Spring Batch,这个问题说明了我的问题。除了使用单个编写器进行简单的块处理外,您不能使用FlatFileItemWriter(FFIW)作为编写器吗?我是新来的 我尝试将FFIW注入ItemProcessors,得到了同样的结果。也许我需要写我自己的定制作家。我试图利用FFIF来做这项工作,因为我所需要的只是筛选一个输入文件并填充三个输出文件。我的routerDelegate工作正常,没有问题。只是写操作失败,因为文件没有打开,我看不到如何手动打开它(我认为这是错误的方法,即使我可以) 谢谢 这是我的密码:

这个问题说明了我的问题。除了使用单个编写器进行简单的块处理外,您不能使用FlatFileItemWriter(FFIW)作为编写器吗?我是新来的

我尝试将FFIW注入ItemProcessors,得到了同样的结果。也许我需要写我自己的定制作家。我试图利用FFIF来做这项工作,因为我所需要的只是筛选一个输入文件并填充三个输出文件。我的routerDelegate工作正常,没有问题。只是写操作失败,因为文件没有打开,我看不到如何手动打开它(我认为这是错误的方法,即使我可以)

谢谢

这是我的密码:

    <batch:step id="processCustPermits" next="somethingElse">
        <batch:description>Sift permits></batch:description>
        <batch:tasklet>
            <batch:chunk reader="custPermitReader" writer="custPermitCompositeWriter"
                commit-interval="1" />
        </batch:tasklet>
    </batch:step>

<bean id="custPermitCompositeWriter"
    class="org.springframework.batch.item.support.ClassifierCompositeItemWriter">
    <property name="classifier">
        <bean
            class="org.springframework.batch.classify.BackToBackPatternClassifier">
            <property name="routerDelegate" ref="permitRouterClassifier" />
            <property name="matcherMap">
                <map>
                    <entry key="hierarchy" value-ref="custPermitWriter" />
                    <entry key="omit" value-ref="custPermitOmithWriter" />
                    <entry key="trash" value-ref="custPermitTrashWriter" />
                </map>
            </property>
        </bean>
    </property>
</bean>
<bean id="custPermitWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
    <property name="resource" value="${sap.cust.permit.outfile.heirarchy}" />
    <property name="lineAggregator" ref="passThroughLineAggregator" />
    <property name="shouldDeleteIfExists" value="true" />
    <property name="shouldDeleteIfEmpty" value="false" />
</bean>
<bean id="custPermitOmithWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
    <property name="resource" value="${sap.cust.permit.outfile.omits}" />
    <property name="lineAggregator" ref="passThroughLineAggregator" />
    <property name="shouldDeleteIfExists" value="true" />
    <property name="shouldDeleteIfEmpty" value="true" />
</bean>
<bean id="custPermitTrashWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
    <property name="resource" value="${sap.cust.permit.outfile.trash}" />
    <property name="lineAggregator" ref="passThroughLineAggregator" />
    <property name="shouldDeleteIfExists" value="true" />
    <property name="shouldDeleteIfEmpty" value="true" />
</bean>

筛选许可证>

有时候你必须仔细阅读。我将Streams元素添加到chunk元素中,瞧

<batch:step id="processCustPermits" next="somethingElse">
    <batch:description>Sort out unwanted permits></batch:description>
    <batch:tasklet>
        <batch:chunk reader="custPermitReader" writer="custPermitCompositeWriter"
            commit-interval="1">
            <batch:streams>
                <batch:stream ref="custPermitWriter" />
                <batch:stream ref="custPermitOmithWriter" />
                <batch:stream ref="custPermitTrashWriter" />
            </batch:streams>
        </batch:chunk>
    </batch:tasklet>
</batch:step>

清理不需要的许可证>

对于那些喜欢Java配置而不喜欢XML配置的人,操作如下:

@Bean
public Step processCustPermits(StepBuilderFactory stepBuilderFactory, 
        @Qualifier("custPermitReader")  ItemReader<Wscpos> custPermitReader,
        @Qualifier("custPermitCompositeWriter") ItemWriter<Wscpos> custPermitCompositeWriter,
        @Qualifier("custPermitWriter") FlatFileItemWriter<Wscpos> custPermitWriter,
        @Qualifier("custPermitOmithWriter") FlatFileItemWriter<Wscpos> custPermitOmithWriter,
        @Qualifier("custPermitTrashWriter") FlatFileItemWriter<Wscpos> custPermitTrashWriter)
{
    return stepBuilderFactory.get("processCustPermits")
        .<Wscpos, Wscpos> chunk(1)
        .reader(custPermitReader)
        .writer(custPermitCompositeWriter)
        .stream(writerCustodyMismatch)
        .stream(writerNoMatch)
        .stream(custPermitTrashWriter)
        .build();
}
@Bean
公共Step流程(StepBuilderFactory StepBuilderFactory,
@限定符(“custPermTreader”)ItemReader custPermTreader,
@限定符(“custPermitCompositeWriter”)ItemWriter custPermitCompositeWriter,
@限定符(“custPermitWriter”)FlatFileItemWriter custPermitWriter,
@限定符(“CustPermithWriter”)FlatFileItemWriter CustPermithWriter,
@限定符(“custPermitTrashWriter”)FlatFileItemWriter(custPermitTrashWriter)
{
返回stepBuilderFactory.get(“ProcessCustPermissions”)
.chunk(1)
.读卡器(客户机)
.writer(客户许可复合编写器)
.stream(writerCustodyMismatch)
.stream(writerNoMatch)
.stream(custPermitTrashWriter)
.build();
}

谢谢!这对我很有帮助,当你说你必须仔细阅读时,你有没有阅读内容的链接?我用的是一种说话的方式。我找到了一个例子,但我没有仔细阅读。将元素“stream”放在“chunk”中是我做错的部分。我把它排除在那个元素之外。很抱歉,这已经有一段时间了,我已经没有现成的例子了。SpringBatch非常有用。我很高兴这篇文章在某种程度上有所帮助。