我创建了一个带有许多线程以执行流并行的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();
}
}