Java 将事务传播到Forkjoin提交

Java 将事务传播到Forkjoin提交,java,spring-boot,transactions,spring-transactions,forkjoinpool,Java,Spring Boot,Transactions,Spring Transactions,Forkjoinpool,我正在创建一个ForkJoinPool,其中包含多个线程,以执行从jpa中的一个查询执行的并行流,但是我在事务性传播到ForkJoinPool的submit方法时遇到了问题 @Transactional(readOnly = true) public void streamTest() { ForkJoinPool customThreadPool = new ForkJoinPool(20); try { customThreadPool.submit(() ->

我正在创建一个ForkJoinPool,其中包含多个线程,以执行从jpa中的一个查询执行的并行流,但是我在事务性传播到ForkJoinPool的submit方法时遇到了问题

@Transactional(readOnly = true)
public void streamTest() {
    ForkJoinPool customThreadPool = new ForkJoinPool(20);
    try {
    customThreadPool.submit(() ->
         priceRepository.streamAll()
         .parallel()
         .map(p -> this.transform(p))
         .forEach(System.out::println)
         ).get();
    } catch (InterruptedException | ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
我得到了一个错误:“您正在尝试执行一个流查询方法,但没有一个使连接保持打开状态的周围事务,以便流可以实际使用。请确保使用流的代码使用@Transactional或任何其他方式声明(只读)事务。”

如果我取下ForkJoinPool来执行流,它可以正常工作。
如何将事务(只读)传播到从ForkJoinPool提交的方法的执行中,有没有办法?

我发现了如何在ForkJoinPool的任务中设置事务。 我只需要像下面那样使用TransactionSynchronizationManager

@Transactional(readOnly = true)
public void streamTest() {
ForkJoinPool customThreadPool = new ForkJoinPool(20);
try {
customThreadPool.submit(() -> {
    TransactionSynchronizationManager.setActualTransactionActive(true);
    TransactionSynchronizationManager.setCurrentTransactionReadOnly(true);
    TransactionSynchronizationManager.initSynchronization();
     priceRepository.streamAll()
     .parallel()
     .map(p -> this.transform(p))
     .forEach(System.out::println);
     }).get();
} catch (InterruptedException | ExecutionException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

}

我发现了如何在ForkJoinPool的任务中设置事务性。 我只需要像下面那样使用TransactionSynchronizationManager

@Transactional(readOnly = true)
public void streamTest() {
ForkJoinPool customThreadPool = new ForkJoinPool(20);
try {
customThreadPool.submit(() -> {
    TransactionSynchronizationManager.setActualTransactionActive(true);
    TransactionSynchronizationManager.setCurrentTransactionReadOnly(true);
    TransactionSynchronizationManager.initSynchronization();
     priceRepository.streamAll()
     .parallel()
     .map(p -> this.transform(p))
     .forEach(System.out::println);
     }).get();
} catch (InterruptedException | ExecutionException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
}