Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在运行时动态选择spring批处理读取器_Java_Spring_Spring Batch - Fatal编程技术网

Java 在运行时动态选择spring批处理读取器

Java 在运行时动态选择spring批处理读取器,java,spring,spring-batch,Java,Spring,Spring Batch,我有一个spring批处理作业,可以将各种银行对账单转换为我的应用程序。每种银行对账单类型都有一个不同的读卡器,所有银行对账单类型只有一个写卡器。这项工作非常简单-读取、处理和写入: <batch:job id="importer" restartable="true"> <batch:step id="import"> <batch:tasklet> <batch:chunk reader="reader

我有一个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批处理读取器来运行此作业。理想情况下,如果我能在第一步就提前阅读,并尝试先“猜测”银行形式的对账单格式,那就太好了。但我离题了

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

问题是,(文件)ItemReader是在步骤开始之前构建的,这意味着文件也将在步骤开始之前打开


您是否尝试将读取器转换和映射逻辑移动到处理器?您可以为此使用PassThroughLineMapper



另一个非常干净的解决方案可能需要额外的预处理步骤,以确定所需的读卡器类型:

  • 创建一个检查类型的步骤(使用经典步骤配置读取第一行,或使用
  • 使用及
  • 每个读卡器类型的步骤配置
  • 每个读者

您可以通过输入参数/或属性文件设置读卡器:

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


您也可以考虑JSP和STEP属性的后期绑定,这里是Spring Buffy

的链接。我们已经尝试实现这一点,但是它似乎不起作用(使用Spring Palt3.0.4,它在这一点上不能访问JooPosits)。我们可能会使用2个不同的步骤和决策器来解决这个问题。