java - Spring Batch 在运行步骤之前解析步骤的资源

标签 java spring batch-processing spring-batch

我有一个由两个步骤组成的 Spring Batch 作业(到目前为止)。

作业中的第一步是在 tasklet 中实现的。它获取需要处理的逗号分隔值 (CSV) 文件(使用大量业务逻辑来确定这些文件是哪些文件),并将它们复制到“拖放区”目录中。

第二步配置为面向 block 的处理,具有读取器和写入器。读取器是一个 MultiResourceItemReader...,它在拖放区目录中查找所有 CSV 文件,并将每个文件委托(delegate)给“真实”读取器(解析 CSV)。

我的问题 是,即使第一步成功,第二步也无法在拖放区目录中找到任何 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>
...

最佳答案

您的“multiFileReader”需要是 scope="step",因此它将模式扩展(bean 属性的初始化)推迟到执行该步骤之前。

关于java - Spring Batch 在运行步骤之前解析步骤的资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13593706/

相关文章:

java - 使用 HBase 配置 Kundera

java - 买车程序-需要用JButton计算最终价格

java - Bean创建异常: Error creating bean with name: Injection of autowired dependencies failed;

java - 执行重复的 Spring Controller 代码的最佳方式?

java - 查询在 Mongo 中工作,但不适用于 spring-data-mongo

hibernate - 为什么要刷新的对象数量应该等于 hibernate.jdbc.batch_size?

java - 替换java中除撇号之外的非字母

java - TibrvException 未连接到守护进程

api - 图批处理 API

hadoop - MapReduce 或 Spark 用于 Hadoop 上的批处理?