Потоковый набор результатов с использованием Spring Data из тасклета Spring Batch - PullRequest
0 голосов
/ 04 июня 2018

Я хочу передать некоторые данные из базы данных после шага 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 {
...

Есть идеи, если то, что я делаю, возможно, и если это то, что я делаю неправильно?

...