是否可以动态创建资源名称?

时间:2014-07-02 19:41:33

标签: spring spring-batch

我正在写入CSV文件并使用FlatFileItemWriter来执行此操作。我有一个bean作为我的类,我也有资源的属性,我提供用于写出项目的文件名。

是否可以将日期和时间附加到文件名?

现在我告诉它写出一个名为report.csv的文件,而不是我希望它写出一个名为report-7-2-2014-16-03.csv的文件

这里是作家的XML配置

<bean id="csvWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
    <property name="resource">
        <bean class="org.springframework.core.io.FileSystemResource">
            <constructor-arg value="${REPORT_FILENAME}" />
        </bean>
    </property>
    <property name="shouldDeleteIfExists" value="true" />
    <property name="lineAggregator">
        <bean class="com.example.CSVLineAggregator" />
    </property>
    <property name="headerCallback">
        <bean class="com.example.CSVHeaderWriter" >
            <constructor-arg value="${REPORT_HEADER}" />
        </bean>
    </property>
</bean>

1 个答案:

答案 0 :(得分:4)

您需要configure your step进行后期绑定才能解决问题 延迟绑定允许您使用存储在jobParameters和作业或步骤执行上下文中的值,在作业/步骤执行期间评估表达式,而不是以静态方式(在xml pasring期间,要清除)评估表达式;这个上下文仅在作业/步骤执行期间可用! 要启用此功能:

  1. 使用特殊step="scope"
  2. 标记您的工件
  3. 添加到职位参数,其名称为&#39; REPORT_FILENAME&#39;和价值&#39;报告-7-2-2014-16-03.csv&#39; (当然,每次启动工作时,这个值都会发生变化,并且您可以将其设为独特的,并创建正确的日期/时间)
  4. 使用带有特殊#{jobParameters['REPORT_FILENAME']}表达式的spEL让SB从作业参数中提取报告名称

  5. <bean id="csvWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
        <property name="resource" value="file://report-dir/#{jobParameters['REPORT_FILENAME']}" />
        <property name="shouldDeleteIfExists" value="true" />
        <property name="lineAggregator">
            <bean class="com.example.CSVLineAggregator" />
        </property>
        <property name="headerCallback">
            <bean class="com.example.CSVHeaderWriter" >
                <constructor-arg value="${REPORT_HEADER}" />
            </bean>
        </property>
    </bean>
    

    这只是一个小例子,但您可以阅读有关Late binding

    的更多信息