【问题标题】:Spring Batch ItemReadListener is never calledSpring Batch ItemReadListener 永远不会被调用
【发布时间】:2020-06-27 02:03:32
【问题描述】:

我正在学习 Spring 批处理。我有一个小的基本工作,它将从平面文件中读取数据并将其写入数据库并发送通知。工作很好。 现在我想使用 ItemReadListener 来了解它是如何工作的,所以我将它添加到我的工作中。 但是当我运行作业时,ItemReadListener 永远不会被调用 下面是我的 ItemListener 的代码

public class CustomItemReadListener implements ItemReadListener {
  @Override
  public void beforeRead() throws Exception {

    System.out.println("Before Read");
  }

  @Override
  public void afterRead(Object o) throws Exception {
    System.out.println("afterRead");
    System.out.println(o.toString());
  }

  @Override
  public void onReadError(Exception e) throws Exception {

  }
}

我的工作定义如下

 <job id="loaddataToDatabase" xmlns="http://www.springframework.org/schema/batch">
    <step id="loadDataStep">
    <tasklet transaction-manager="transactionManager">
      <chunk commit-interval="100" reader="feedItemReader" writer="feedItemWriter">
      <listeners>
        <listener ref="customItemReadListener">
        </listener>
      </listeners>
      </chunk>
    </tasklet>
    <next on="FAILED" to="sendFileLoadNotification"/>

    <next on="*" to="sendFileLoadNotification"/>

  </step>
  </job>

  <bean id="customItemReadListener" class="com.listeners.CustomItemReadListener" scope="step"/>

作业成功运行,但从未调用 ItemReadListener。我的工作配置是正确的还是我遗漏了什么? 谢谢。

【问题讨论】:

  • 您确定至少阅读了一项吗?还是因为错误而调用了 listener#onReadError()?
  • 您好,我可以看到记录已被读取并写入数据库,但从未调用过侦听器
  • 您可以删除监听器的范围并重新运行该作业吗?在这种情况下,范围似乎毫无用处。我无法调试,所以如果您没有找到并且没有人回答您的问题,您可以将 SB 日志设置为调试级别并自己阅读日志或调试流程
  • 您是否尝试将listeners 移到&lt;chunk&gt; 元素之外并放在&lt;tasklet&gt; 下(又名&lt;chunk&gt; 旁边)?

标签: spring spring-boot spring-batch


【解决方案1】:

您必须将侦听器放在块之后。这个配置对我有用:

@Bean
    public Step kycCreationStep() {
        log.debug("start kycCreationStep ...");
        return stepBuilderFactory.get("kycCreationStep").<IndividualImport, IndividualImport>chunk(initChunkSize).listener(new StepItemReadListener())
                .reader(kycCreationReader(null, null, null)).processor(kycCreationProcessor())
                .writer(kycCreationWriter(null)).allowStartIfComplete(true).build();
    }

【讨论】:

    【解决方案2】:
    public class CustomItemReadListener implements ItemReadListener {
        @Override
        @BeforeRead
        public void beforeRead() throws Exception {
    
            System.out.println("Before Read");
        }
    
        @Override
        @AfterRead
        public void afterRead(Object o) throws Exception {
            System.out.println("afterRead");
            System.out.println(o.toString());
        }
    
        @Override
        @OnReadError
        public void onReadError(Exception e) throws Exception {
    
        }
    }
    

    需要添加注解,因为public SimpleStepBuilder&lt;I, O&gt; listener(Object listener)这个方法会检查注解是否存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-27
      • 2013-10-12
      • 2012-03-27
      • 2013-08-29
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 2015-05-06
      相关资源
      最近更新 更多