这是一个艰难的,但我相信这并不是闻所未闻。
我有两个数据集,国家和受众特征。国家/地区数据集包含国家/地区的名称以及人口统计数据的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配置吗?
提前致谢。
答案 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;
}
}
然后,您只需从上下文中读取,就像您在步骤中的正常步骤或作业上下文一样。