Распространить транзакцию в Forkjoin представить - PullRequest
1 голос
/ 26 мая 2019

Я создаю 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();
    }
}

Я получаю сообщение об ошибке: «Вы пытаетесь выполнить метод потокового запроса без окружающей транзакции, которая сохраняет соединение открытым, чтобы поток мог быть фактически использован. Убедитесь, что код, использующий поток, использует @Transactional или любой другой способ объявления транзакции (только для чтения). "

Если я снимаю ForkJoinPool для выполнения потока, он работает нормально. Как я могу распространить транзакцию (readOnly) на выполнение метода, отправленного из ForkJoinPool, есть ли способ?

1 Ответ

0 голосов
/ 26 мая 2019

Я обнаружил, как установить транзакцию внутри задачи 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();
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...