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

con*_*ept 3 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>
Run Code Online (Sandbox Code Playgroud)

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

  1. 分区
  2. 将动态值传递给分区中的步骤

提前致谢.

Jon*_*tow 11

是的,查看弹簧批的分区功能!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>
Run Code Online (Sandbox Code Playgroud)

现在有些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;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,您只需从步骤中的正常步骤或作业上下文中读取上下文.