首页 文章

Spring Batch解析步骤's resources before it'的时间来运行该步骤

提问于
浏览
4

我有一个包含两个步骤(到目前为止)的Spring Batch作业 .

作业中的 first step 在tasklet中实现 . 它采用需要处理的逗号分隔值(CSV)文件(使用大量业务逻辑来确定它们是哪些),并将它们复制到"drop zone"目录中 .

second step 配置为面向块的处理,带有读写器 . 阅读器是 MultiResourceItemReader ...,它查找放置区目录中的所有CSV文件,并将每个文件委派给"real"阅读器(解析CSV) .

My problem 即使第一步成功,第二步也无法在放置区目录中找到任何CSV文件 . 有趣的是,如果我立即再次运行批处理作业...那么第二步确实找到并处理文件!

我猜测,但看起来Spring Batch在开始时解决了第二步的通配符模式......而不是等到第二步运行的时候 . 即使第一步复制了它应该的文件,第二步已经确定那里没有文件 .

我是Spring Batch的新手,还在学习我的方法 . 我在这里缺少哪些具有背景或范围的明显事物?我的工作定义的相关部分如下 . 谢谢!

...
<!-- JOB DEFINITION -->
<job id="notificationJob" xmlns="http://www.springframework.org/schema/batch">
    <step id="copyFilesToLocal">
        <tasklet transaction-manager="jobRepositoryTransactionManager" ref="getFilesTasklet" />
        <next on="COMPLETED" to="processFiles"/>
    </step>
    <step id="processFiles">
        <tasklet transaction-manager="ecommerceTransactionManager">
            <chunk reader="multiFileReader" writer="notificationEmailWriter" commit-interval="1" />
        </tasklet>
    </step>
</job>

<!-- FIRST STEP -->
<bean id="getFilesTasklet" class="com.mypackage.FileMovingTasklet">
    <property name="localDao">
        <bean class="com.mypackage.BatchLocalDao">
            <property name="dataSource" ref="jobRepositoryDataSource" />
        </bean>
    </property>
    <property name="sourceDirectory">
        <bean id="sourceDirectory" class="org.springframework.core.io.FileSystemResource">
            <constructor-arg value="/mnt/source-directory" />
        </bean>
    </property>
    <property name="destinationDirectory">
        <bean id="destinationDirectory" class="org.springframework.core.io.FileSystemResource">
            <constructor-arg value="/home/myuser/drop-zone" />
        </bean>
    </property>
</bean>


<!-- SECOND STEP -->
<bean id="multiFileReader" class="org.springframework.batch.item.file.MultiResourceItemReader">
    <property name="resources" value="file://home/myuser/drop-zone/*.csv" />
    <property name="delegate" ref="myFileReader" />
</bean>
...

1 回答

  • 6

    您的“multiFileReader”需要是scope =“step”,因此它会延迟模式扩展(bean属性的初始化),直到执行该步骤 .

相关问题