通过两个步骤传递数据 - 自定义字段映射器和自定义Tasklet

时间:2013-12-02 13:36:04

标签: spring-batch

这是我的工作配置:

<batch:job id="clientesJob" job-repository="jobRepository">
    <batch:step id="step1" next="renameFiles">
        <tasklet>
            <chunk reader="multiResourceReader" writer="sqlWriter"
                commit-interval="1" />
        </tasklet>
    </batch:step>
    <batch:step id="renameFiles">
        <tasklet ref="fileRenamingTasklet" />
    </batch:step>
</batch:job>

<bean id="multiResourceReader"
    class=" org.springframework.batch.item.file.MultiResourceItemReader">
    <property name="resources" value="file:c:/cvs/basecli*" />
    <property name="delegate" ref="flatFileItemReader" />
</bean>

<bean id="flatFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader">
    <property name="lineMapper">
        <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
            <property name="fieldSetMapper" ref="clienteMapper" />
            <property name="lineTokenizer" ref="tickerLineTokenizer" />
        </bean>
    </property>
</bean>

<bean name="tickerLineTokenizer"
    class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer" />

<bean id="clienteMapper" class="com.bind.mapper.ClienteFieldSetMapper">
</bean>

<bean id="fileRenamingTasklet" class="com.bind.tasklet.FileRenamingTasklet">
    <property name="directory" value="file:c:/cvs/" />
</bean>

在第一步中,我正在使用MultiResourceItemReader读取文件夹,然后将其写入SQL Server。 第二个重命名文件,如“PROCESSFILE- {originalname}”。

我要归档的事情是在第一步中出现问题,以“PROCESSERROR- {originalname}”之类的不同方式重命名文件。 所以我必须知道FileRenamingTasklet中第一步的状态。

我读过有关将数据设置为stepExecutionContext的内容。但我无法访问ClienteFieldSetMapper。 我也尝试使用监听器,但在那里我无法传递数据。

为了进一步考虑,我需要文件名和状态。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

fileRenamingTasklet成为StepExecutionListener并听取step1 afterStep结果;在StepExecutionListener.afterStep(StepExecution stepExecution)检查stepExecution.getExitStatus(),您就可以正确重命名文件了。

要添加侦听器,您必须将xml修改为:

<batch:step id="step1" next="renameFiles">
  <tasklet>
    <chunk reader="multiResourceReader" writer="sqlWriter" commit-interval="1" />
  </tasklet>
  <listeners>
    <listener ref="fileRenamingTasklet" />
  </listeners>
</batch:step>