【问题标题】:How to skip exception thrown in a method annotated with @BeforeStep如何跳过使用 @BeforeStep 注释的方法中引发的异常
【发布时间】:2017-06-06 07:08:57
【问题描述】:

我正在使用块读取器、处理器和写入器模式来处理我们的数据。我采用的方法是,在使用 Reader 的读取方法之前,我运行一个连接到 db 并提取所有必需数据的 sql。这是在一个用@BeforeStep 注释的方法中完成的,输出数据成为 Reader 的 read 方法的源,该方法遍历生成的数据并为处理器检索每次读取的项目。在流程中抛出的任何异常都会被捕获并使用@Retryable 功能重试,并使用可跳过的异常功能跳过。

让我感到困惑的是,在使用 @BeforeStep 注释的方法中引发的任何异常都会被捕获,并且应用程序会引发自定义的可跳过异常,而系统不会跳过该异常。这是期望的行为还是我错过了什么。请帮帮我。

谢谢, 拉文德拉

【问题讨论】:

  • 在@BeforeStep 中提取数据而不是直接使用基于 SQL 的 ItemReader 的具体原因是什么?
  • @LucaBassoRicci - 这是按照设计。我们要打开一个连接,运行一个大 sql 来获取数据并处理检索到的数据。

标签: spring-batch


【解决方案1】:

如果设计迫使您从数据库中提取数据,一个合理的解决方案是在主要步骤之前创建一个步骤,并将代码从 @BeforeStep 移动到这个新步骤;您可以比在侦听器中更好地管理可跳过的异常和重试条件。

你可以看看这个答案(Can we write a Spring Batch Job Without ItemReader and ItemWriter);在Tasklet#execute() 中写如下内容:

class MyTasklet implements Tasklet {
 @Override
 public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
  // Fetch data using JdbcTemplate (for example) and pull to external bean to let extracted data visible to next step
  return RepeatStatus.FINISHED;
 }
}

还要检查 SO 以了解“在步骤弹簧批次之间传递数据”以获取更多信息

【讨论】:

  • @LucaBassoRicci - 这听起来是一种选择。我想了解一下,平台是否支持这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多