在运行时动态选择弹簧批量阅读器

时间:2012-01-21 18:11:42

标签: java spring spring-batch

我有一个弹出批处理作业,可以将各种银行对帐单转换为我的应用程序。每种银行对账单类型都有不同的读者,所有这些只有一位作者。这项工作非常简单 - 阅读,处理和写作:

<batch:job id="importer" restartable="true">
    <batch:step id="import">
        <batch:tasklet>
            <batch:chunk reader="reader" writer="writer" processor="processor" commit-interval="10" />
        </batch:tasklet>
    </batch:step>
</batch:job>

现在,我希望最终用户提供一个语句文件以及银行信息,然后在运行时选择相应的弹簧批阅读器来运行此作业。理想情况下,如果我能够在第一步中预读并尝试首先“猜测”银行表单语句格式,那将是很好的。但我离题了。

在运行之前是否可以将读卡器注入作业?或者有更好的方法来实现我的目标吗?

2 个答案:

答案 0 :(得分:2)

您可以从输入参数/或属性文件中设置阅读器:

<batch:chunk reader="#{jobParameters['reader.beanId']}" writer="writer" processor="processor" commit-interval="10" />

你也可以考虑作业和步骤属性的后期绑定,这里是弹簧批step-scope的链接

答案 1 :(得分:1)

问题是,(文件)项目阅读器是在步骤开始之前构建的,这意味着文件将在步骤开始之前打开


您是否尝试将读取器转换和映射逻辑移至处理器?你可以使用PassThroughLineMapper来实现这个

<bean id="dumbItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
    <property name="resource" value="#{jobParameters['input.file']}" />
    <property name="lineMapper">
        <bean class="org.springframework.batch.item.file.mapping.PassThroughLineMapper" />
    </property>
    <property name="strict" value="true" /><!-- optional -->
</bean>

另一个非常干净的解决方案可能需要额外的预备步骤才能找到所需的读者类型: