使用Spring Batch Tasklet中的Spring Data流结果集

时间:2018-06-04 20:51:34

标签: java spring spring-data-jpa java-stream spring-batch

我想在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:   您没有尝试执行流式查询方法   周围的事务,保持连接打开,以便   实际上可以消耗流。确保代码消耗了   stream使用@Transactional或任何其他方式声明(只读)   事务。

AdRepository课程遵循here的建议,因此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();

    ...
}

我还确保在documentation告诉的Job的配置类中包含@EnableTransactionManagement注释。

...
@Configuration
@EnableTransactionManagement
public class MainTaskletsConfig {
...

任何想法,如果我正在做什么甚至是可能的,如果这是我做错了什么?

0 个答案:

没有答案