我有春季工作,读取文件,处理数据,然后将其写入oracle数据库。
声明我的工作时出现问题,错误:
对于类型SimpleStepBuilder ,Map >,方法listener(Object)模棱两可
我不明白该错误,为什么它没有使用listener(ItemListener..) method
。有任何想法吗 ?
编辑:使用单独的侦听器,有3个对象实现ItemWriteListener<T>
,ItemReadListener<T>
和ItemProcessorListener<T,O>
并构建如下步骤:
//...
.reader(/* custom ItemReader */)
.listener(/* custom ItemReadListener<T> */)
.listener(/* custom ItemWriterListener<T> */)
.listener(/* custom ItemProcessorListener<T,O> */)
//...
.build();
该错误消失了,但是我仍然不明白为什么它不适用于
ItemListenerSupport
类。这是我的步骤的构建方式:
SimpleStepBuilder<Map<String, Object>, Map<String, Object>> stepBuilder = stepBuilderFactory
.get("testStep")
.<Map<String, Object>, Map<String, Object>>chunk(5000)
.reader(/* custom ItemReader<Map<String, Object>> object */));
.processor(/*custom ItemProcessor<Map<String, Object>, Map<String, Object>> object */))
.writer(/*custom ItemWriter<Map<String,Object> object */)
.listener(new GenericItemListener<Map<String, Object>, Map<String, Object>>())
.build();
这是我的自定义
ItemListenerSupport
:import java.util.List;
import org.springframework.batch.core.listener.ItemListenerSupport;
public class GenericItemListener<I, R> extends ItemListenerSupport<I, R> {
@Override
public void onReadError(Exception e) {
//do something
}
@Override
public void onWriteError(Exception e, List<? extends R> items) {
//do something
}
@Override
public void onProcessError(I items, Exception e) {
//do something
}
}
最佳答案
我遇到了同样的问题。
我不知道这是否是处理此问题的最佳方法,但我通过投放
ItemListenerListener的ItemListenerSupport子类
这里的听众:
class CustomListener extends ItemListenerSupport<Input, Output> {
@Override
public void onProcessError(Input item, Exception e) {
log.error(item.toString(), e);
}
public ItemProcessListener<? super Input, ? super Output> asItemProcessListener() {
return this;
}
}
这里的步骤定义
steps.get("step").<Input, Output>chunk(10)
.reader(reader)
.listener(listener.asItemProcessListener())
.processor(processor)
.build()