我已经实现了Spring批处理partitioning,我从Map<String, ExecutionContext> result = new HashMap<>();
的partition()方法返回Partitioner
。
我的要求是按特定顺序启动从属步骤(插入订单到result
地图),而上述Map
不会发生这种情况。
我尝试使用Map<String, ExecutionContext> result = new LinkedHashMap<>();
,这也没用 - 来自地图的任何线程都是随机启动的。
我在主步骤配置中使用SimpleAsyncTaskExecutor
作为执行程序,并且concurrencyLimit
并行线程已启动。如果我设置concurrencyLimit=1
,那么我希望第一个线程插入result
地图以开始使用,依此类推。
如何实施此排序?
答案 0 :(得分:2)
从查看代码,以及上面的步骤,你可能需要覆盖StepExecutionSplitter#split,我相信你可以扩展SimpleStepExecutionSplitter类并实现Split方法,在split方法中你需要更改用于从HashSet收集StepExecution的set到LinkedHashSet,如果你想考虑重启,那么你可能还需要考虑改变getContexts方法。
以下是添加拆分器的代码段。
stepBuilders.get("partitionStep")
.partitioner(slaveStep)
.partitioner("myParitionerStep", partitioner)
.taskExecutor(new SimpleThreadPoolTaskExecutor())
.splitter(new SimpleStepExecutionSplitter(jobRepository, allowStartIfComplete, stepName, partitioner))
.build()