Повторная попытка считывателя весной Batch - PullRequest
0 голосов
/ 26 апреля 2020

Я написал весеннее пакетное приложение, и программа чтения предметов выдает исключение. Как мне повторить попытку чтения элементов? Я добавил @EnableRetry в класс приложения, и ниже приведен код считывателя

@Bean
  @Retryable(include = { RuntimeException.class }, maxAttempts = 1000, backoff = @Backoff(delay = 0))
  public ItemReader<Student> reader() {
    return new InMemoryStudentReader();
  }

Ниже приведен класс считывателя

public class InMemoryStudentReader implements ItemReader<Student> {

  @Autowired
  private JdbcTemplate jdbcTemplate;

  private int nextStudentIndex;
  private List<Student> studentData;

  public InMemoryStudentReader() {
    initialize();
  }


  private void initialize() {
    Student s1 = new Student(1, "ABC");
    Student s2 = new Student(2, "DEF");
    Student s3 = new Student(3, "GHI");

    studentData = Collections.unmodifiableList(Arrays.asList(s1, s2,s3));
    nextStudentIndex = 0;
  }

  @Override
  public Student read() throws Exception {
    Student nextStudent = null;

    if (nextStudentIndex < studentData.size()) {
      int a =jdbcTemplate.queryForObject("SELECT id FROM val LIMIT 1", Integer.class);
      if(a == 2) {
        throw new RuntimeException("Exception");
      }
      nextStudent = studentData.get(nextStudentIndex);
      nextStudentIndex++;
    } else {
      nextStudentIndex = 0;
    }

    return nextStudent;
  }
}

Но даже после этого считыватель не повторяется и работа терпит неудачу

1 Ответ

1 голос
/ 27 апреля 2020

Вы добавляете @Retryable в метод определения бина. Этот метод вызывается только во время конфигурирования Spring для создания экземпляра вашего bean-компонента и вряд ли даст сбой.

Вы должны добавить аннотацию к методу read вашего ридера, который вызывается во время выполнения, когда шаг выполняется и может выдать исключение:

@Override
@Retryable(include = { RuntimeException.class }, maxAttempts = 1000, backoff = @Backoff(delay = 0))
public Student read() throws Exception {
   ...
}
...