数据列表中每个项目的Spring Batch-Repeat步骤

时间:2012-05-10 08:58:16

标签: spring spring-batch

这是一个艰难的,但我相信这并不是闻所未闻。

我有两个数据集,国家和受众特征。国家/地区数据集包含国家/地区的名称以及人口统计数据的ID。

人口统计数据集是从国家到郊区的分层数据集。

这两个数据集都是每周从第三方提取的。

我需要将人口统计信息分成文件,每个国家一个。

到目前为止,我所拥有的步骤是 1)拉国家 2)拉动人口统计学 3)(这是必需的)在国家数据集上循环调用“将国家人口统计数据写入文件”

是否有可能以某种方式重复传递当前国家/地区ID的步骤?

编辑:添加了PartitionHandler示例的链接

谢谢JBristow。下面的链接显示了使用重写PartitionHandler来使用JavaTask对象的addArgument传递参数,但它看起来像是开发人员的很多繁重工作而不是非常“特定于业务问题”,这是Spring批处理的目标。 http://www.activeeon.com/blog/all/integration/distribute-a-spring-batch-job-on-the-proactive-scheduler

我还在原始链接部分7.4.3中看到过。将输入数据绑定到步骤这是在7.4.2的上下文中。分区,看起来非常令人兴奋

<bean id="itemReader" scope="step"
    class="org.spr...MultiResourceItemReader">
  <property name="resource" value="#{stepExecutionContext[fileName]}/*"/>
</bean>

我不认为任何人都有一些样本的XML配置吗?

  1. 分区
  2. 将动态值传递给分区中的步骤
  3. 提前致谢。

1 个答案:

答案 0 :(得分:11)

是的,请查看spring-batch的分区功能! http://static.springsource.org/spring-batch/reference/html-single/index.html#partitioning

基本上,它允许您使用“分区器”来创建新的执行上下文,以传递给处理程序,然后处理程序对该信息执行某些操作。

虽然对并行化进行了分区,但它的默认并发性为1,因此您可以从小处开始,然后将其调高以匹配您可以使用的硬件。由于我假设每个国家/地区的数据不依赖于其他国家(至少在下载人口统计步骤中),您的工作可以使用基本的并行化。

/编辑:添加示例。

这是我做的(或多或少): 首先,XML:

<beans>
  <batch:job id="jobName">
    <batch:step id="innerStep.master">
      <batch:partition partitioner="myPartitioner" step="innerStep"/>
    </batch:step>
  </batch:job>
  <bean id="myPartitioner" class="org.lapseda.MyPartitioner" scope="step">
    <property name="jdbcTemplate" ref="jdbcTemplate"/>
    <property name="runDate" value="#{jobExecutionContext['runDate']}"/>
    <property name="recurrenceId" value="D"/>
  </bean>
  <batch:step id="summaryDetailsReportStep">
    <batch:tasklet>
      <batch:chunk reader="someReader" processor="someProcessor" writer="someWriter" commit-interval="10"/>
    </batch:tasklet>
  </batch:step>
</beans>

现在有些Java:

public class MyPartitioner implements Partitioner {
  @Override 
  public Map<String, ExecutionContext> partition(int gridSize) {
    List<String> list = getValuesToRunOver();
    /* I use treemap because my partitions are ordered, hashmap should work if order isn't important */
    Map<String, ExecutionContext> out = new TreeMap<String, ExecutionContext>(); 
    for (String item : list) {
      ExecutionContext context = new ExecutionContext();
      context.put("key", "value"); // add your own stuff!
      out.put("innerStep"+item, context);
    }
    return out;
  }
}

然后,您只需从上下文中读取,就像您在步骤中的正常步骤或作业上下文一样。