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

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

<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>

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

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

回答(2)

2 years ago

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

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

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

2 years ago

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


您是否尝试将读取器转换和映射逻辑移至处理器?你可以使用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>

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