2012-01-21 65 views
2

弹簧一批读者我有一个转换各种银行对账单到我的应用程序弹簧批处理作业。有一个不同的读者对每个银行对帐单类型,只有一个作家的全部。这项工作是非常简单的 - 读取,处理和写入:动态地选择在运行时

<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

您可以从输入参数/或化子性质文件中设置的读者:

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

你也可以考虑后期绑定工作和step属性,在这里从春季批次的链接step-scope

+0

我们试图实现这个,但它似乎没有工作(使用Spring批次3.0.4,它失败在这一点上访问jobParameters),我们将使用可能解决此2个不同步骤和决定因素。 – Dayde

1

的问题是,(文件)Itemreaders步骤开始之前构造,这意味着该文件将被打开处理器?你可以使用一个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> 

另一种非常干净的解决方案可能与一个额外的前阶段工作,以找到自己需要的读者类型: