【问题标题】:Spring batch ItemListenerSupport ambiguous for the type when building the stepSpring批处理ItemListenerSupport在构建步骤时类型不明确
【发布时间】:2018-12-15 00:34:47
【问题描述】:

我有读取文件、处理数据然后将其写入 oracle 数据库的 spring 作业。

我在宣布我的工作时遇到问题,错误:

方法 listener(Object) 对于 SimpleStepBuilder,Map>

类型不明确

我不明白这个错误,为什么它不使用 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
    }
}

【问题讨论】:

  • 我不知道你想用你的听众实现什么。您可以使用 try catch 块来处理异常/错误。我使用单独的侦听器(如 ItemWriterListener,我需要它来计算写入计数)。

标签: java spring spring-boot spring-batch


【解决方案1】:

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 */))
  .listener((ItemReadListener)genericItemListener)
.processor(/*custom ItemProcessor<Map<String, Object>, Map<String, Object>> object */))
  .listener((ItemProcessorListener)genericItemListener)
.writer(/*custom ItemWriter<Map<String,Object> object */)
  .listener((ItemWriterListener)genericItemListener)
.listener(new GenericItemListener<Map<String, Object>, Map<String, Object>>())
.build();

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。

    我不知道这是否是处理这个问题的最佳方法,但我通过投射我的 ItemListenerSupport 是 ItemProcessListener 的子类

    听者在这里:

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      相关资源
      最近更新 更多