我想在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 {
...
任何想法,如果我正在做什么甚至是可能的,如果这是我做错了什么?