我Spring-Batch
用来读取csv文件,格式化内容并将其写入数据库,例如:
StepBuilder<T, T> builder = stepBuilderFactory.get("step")
.<T, T>chunk(100)
.reader(flatFileItemReader)
.processor(processor)
.writer(jpaItemWriter);
csv包含一个ID列。如何修改,reader
以基于该ID的块?考试:
#id, #value
1, first
1000, second
1001, second
1005, second
在这种情况下,块将仅读取第一行,然后提交,然后继续。
是否可以通过文件中的值应用分块?
我使用自定义的CompletionPolicy和PeekableItemReader进行了相同的操作。
代码背后的想法是偷看下一个项目,从下一个元素中读取perper,并检查值的变化。
发生值更改时,true
从返回CompletionPolicy.isComplete()
。
重要提示:此策略必须注册为步骤侦听器!
public class BreakKeyCompletionPolicy extends CompletionPolicySupport{
private BreakKeyCompletionContext cc;
private PeekableItemReader<Object> reader;
// Strategy used to check for value break
private BreakKeyStrategy<Object> strategy;
public void setReader(PeekableItemReader<Object> forseeingReader){
this.reader = forseeingReader;
}
@Override
public boolean isComplete(RepeatContext context){
return this.cc.isComplete();
}
@Override
public RepeatContext start(RepeatContext context) {
context.setAttribute("current", null);
this.cc = new BreakKeyCompletionContext(context);
return cc;
}
/** Context contains current element ("current" property" and manage next element.
* Null next element is treated as a key break
*/
protected class BreakKeyCompletionContext extends RepeatContextSupport {
public BreakKeyCompletionContext(RepeatContext context) {
super(context);
}
public boolean isComplete(){
final Object next;
try{
next = reader.peek();
}
catch (Exception e){
throw new NonTransientResourceException("Unable to peek", e);
}
if (null == next){
return true;
}
return strategy.isKeyBreak(this.getAttribute("current"), next);
}
}
@AfterRead
public void afterRead(Object item){
this.cc.setAttribute("current", item);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句