最简单的方法是按国家划分您的步骤。这样,每个国家都可以迈出自己的一步,您还可以跨国家穿梭,以提高绩效。
如果需要一个读者,则可以包装委托
PeekableItemReader并扩展
SimpleCompletionPolicy以实现您的目标。
public class CountryPeekingCompletionPolicyReader extends SimpleCompletionPolicy implements ItemReader<CountrySpecificItem> { private PeekableItemReader<? extends CountrySpecificItem> delegate; private CountrySpecificItem currentReadItem = null; @Override public CountrySpecificItem read() throws UnexpectedInputException, ParseException, NonTransientResourceException, Exception { currentReadItem = delegate.read(); return currentReadItem; } @Override public RepeatContext start(final RepeatContext context) { return new ComparisonPolicyTerminationContext(context); } protected class ComparisonPolicyTerminationContext extends SimpleTerminationContext { public ComparisonPolicyTerminationContext(final RepeatContext context) { super(context); } @Override public boolean isComplete() { final CountrySpecificItem nextReadItem = delegate.peek(); // logic to check if same country if (currentReadItem.isSameCountry(nextReadItem)) { return false; } return true; } }}然后根据您的上下文定义:
<batch:tasklet> <batch:chunk chunk-completion-policy="countrySpecificCompletionPolicy" reader="countrySpecificCompletionPolicy" writer="someWriter" /></batch:tasklet><bean id="countrySpecificCompletionPolicy" > <property name="delegate" ref="peekableReader" /></bean><bean id="peekableReader" />
编辑: 仔细考虑您的问题,分区是最干净的方法。使用分区步骤,将从步骤执行上下文向每个ItemReader(确保
scope="step")传递一个
countryName。是的,您需要一个自定义
Partitioner类来构建执行上下文图(每个国家/地区一个条目)和一个硬编码的提交间隔,该间隔足够大以容纳最大的工作单元,但是此后一切都非常简单,并且每个从属步骤仅是一个单独的步骤,对于可能遇到问题的任何国家,重新启动应该是一件轻而易举的事。



