Я хочу передать некоторые данные из базы данных после шага Spring Batch Tasklet
public class TaskletUpdateAll implements Tasklet {
@Autowired
private AdRepository adRepository;
@Override
public RepeatStatus execute(StepContribution sc, ChunkContext cc) {
return RepeatStatus.FINISHED;
}
@AfterStep
@Transactional(readOnly = true)
public ExitStatus afterStepMethod(StepExecution stepExecution) {
try (Stream<Pair<String, String>> adStream = adRepository.streamAll();) {
adStream.forEach((Pair ad) -> {
// Process ad
});
}
return ExitStatus.COMPLETED;
}
}
Несмотря на то, что метод, вызывающий поток, помечен @Transactional(readOnly = true)
, он по-прежнему возвращает следующее сообщение об ошибке:
Причина: org.springframework.dao.InvalidDataAccessApiUsageException: вы пытаетесь выполнить метод потокового запроса без окружающей транзакции, которая сохраняет соединение открытым, чтобы поток мог фактически использоваться.Убедитесь, что код, использующий поток, использует @Transactional или любой другой способ объявления транзакции (только для чтения).
Класс AdRepository
следует совету здесь , поэтомуstreamAll
метод выглядит следующим образом:
@Repository
public interface AdRepository extends JpaRepository<Ad, Long> {
@QueryHints(value = @QueryHint(name = "HINT_FETCH_SIZE", value = "" + Integer.MIN_VALUE))
@Query(value = "SELECT href, provider FROM ad", nativeQuery = true)
Stream<Pair<String, String>> streamAll();
...
}
Я также включил аннотацию @EnableTransactionManagement
в класс конфигурации для задания, как указано в документации .
...
@Configuration
@EnableTransactionManagement
public class MainTaskletsConfig {
...
Есть идеи, если то, что я делаю, возможно, и если это то, что я делаю неправильно?