建议:
1) 使用 JdbcCursorItemReader 读取数据。
所有开箱即用的组件都是不错的选择,因为它们已经实现了 ItemStream 接口,使您的步骤可重新启动。但是就像您提到的,有时,请求只是为了复杂化,或者像我一样,您已经拥有可以重用的服务或 DAO。
我建议您使用 ItemReaderAdapter。它允许您配置一个委托服务来调用以获取您的数据。
<bean id="MyReader" class="xxx.adapters.MyItemReaderAdapter">
<property name="targetObject" ref="AnExistingDao" />
<property name="targetMethod" value="next" />
</bean>
注意 targetMethod 必须遵守 ItemReaders 的读取约定(没有更多数据时返回 null)
如果您的工作不需要重新启动,您可以简单地使用类:org.springframework.batch.item.adapter.ItemReaderAdapter
但是如果你需要你的工作是可重新启动的,你可以像这样创建你自己的 ItemReaderAdapter:
public class MyItemReaderAdapter<T> extends AbstractMethodInvokingDelegator<T> implements ItemReader<T>, ItemStream {
private long currentCount = 0;
private final String CONTEXT_COUNT_KEY = "count";
/**
* @return return value of the target method.
*/
public T read() throws Exception {
super.setArguments(new Long[]{currentCount++});
return invokeDelegateMethod();
}
@Override
public void open(ExecutionContext executionContext)
throws ItemStreamException {
currentCount = executionContext.getLong(CONTEXT_COUNT_KEY,0);
}
@Override
public void update(ExecutionContext executionContext) throws ItemStreamException {
executionContext.putLong(CONTEXT_COUNT_KEY, currentCount);
log.info("Update Stream current count : " + currentCount);
}
@Override
public void close() throws ItemStreamException {
// TODO Auto-generated method stub
}
}
因为开箱即用的 itemReaderAdapter 不可重新启动,您只需创建自己的实现 ItemStream
2)关于 7 步与 1 步。
我会在这一步上使用compositeProcessor 一步。7个步骤选项只会带来问题IMO。
1)7步databean:所以你的作家在databean中提交直到第7步..然后第7步作家尝试提交到真正的数据库和繁荣错误!!!一切都丢失了,批次必须从第 1 步重新开始!!
2)上下文的7个步骤:可能会更好,因为您将状态保存在spring批处理元数据中..但是将大数据存储在springBatch的元数据中不是一个好习惯!
3)是去海事组织的方式。;-)