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配置吗?
提前致谢.
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)
然后,您只需从步骤中的正常步骤或作业上下文中读取上下文.
| 归档时间: |
|
| 查看次数: |
9540 次 |
| 最近记录: |