mitaichik
@mitaichik

Как выполнять JPA запросы в левых потоках (ExecutorService)?

Ребята, всем привет.

Есть компонент, в нем ExecutorService. В него я сабмичу таски, которые работают с JPA.
При вызове JPA получаю эксепшн No EntityManager with actual transaction available for current thread
Пробовал все обвешать @Transactional - не работает.
Как быть в такой ситуации? Простых решений не нашел. Помогает только если повесить @Transactional на сам метод в репозитории, но это явно не решение.

Если возник вопрос зачем ExecutorService - без него не обойтись, там сложная история (стороняя библиотека)

Вот код для примера:

@Component
@Transactional
public class TestComponent
{
	@Autowired
	private AccountReposiotry reposiotry;

	private final ExecutorService executor = Executors.newSingleThreadExecutor();

	@Scheduled(fixedDelay = 5000)
	@Transactional
	public void doSome()
	{
		executor.submit(this::delete);
	}

	@Transactional
	public void delete()
	{
		try {
			reposiotry.deleteByUserId(3);
		}
		catch (Throwable t) {
			t.printStackTrace();
		}
	}
}
  • Вопрос задан
  • 82 просмотра
Решения вопроса 1
azerphoenix
@azerphoenix Куратор тега Spring
Java Software Engineer
Добрый день.
А вы не смотрели случайно вот, этот ответ - ссылка
К слову, ответ дан одним из олимпиадников по Java.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы