传播交易到forkjoin提交



我创建了一个带有许多线程以执行流并行的forkjoinpool,该线程是从jpa中的查询执行的,但是我在交易式传播方面遇到了麻烦提交forkjoinpool。

@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();
    }
}

我正在遇到错误:"您正在尝试执行流媒体查询方法,而无需保持连接打开的周围交易,以便实际消耗流。宣布(仅阅读(交易的任何其他方式。"

如果我取下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();
}

}

最新更新