У меня возникла проблема, когда мне нужно выполнить несколько медленных HTTP-запросов в отдельном потоке после записи в базу данных с использованием JpaRepository. Проблема в том, что doActualJob()
блокируется в ожидании разрешения серии фьючерсов. Это, по-видимому, препятствует закрытию основного сеанса Hibernate, что приводит к тому, что у приложения заканчиваются соединения вскоре после этого.
Как мне написать эту функцию, чтобы соединение с базой данных не оставалось открытым во время блокирующего ввода-вывода? Возможно ли даже использование JpaRepositories или мне нужно использовать API более низкого уровня, например EntityManager / SessionFactory?
@Service
class SomeJobRunner {
private final SomeJobRepository mSomeJobRepository; //extends JpaRepository
@AutoWired
public SomeJobRunner(final SomeJobRepository someJobRepository) {
mSomeJobRepository = someJobRepository;
}
@Async
public void doSlowJob(final long someJobId) {
SomeJob someJob = mSomeJobRepository.findOne(someJobId);
someJob.setJobStarted(Instant.now());
mSomeJobRepository.saveAndFlush(someJob);
doActualjob(); // Synchronous job doing several requests using Unirest in series
someJob = mSomeJobRepository.findOne(someJobId);
someJob.setJobEnded(Instant.now());
mSomeJobRepository.saveAndFlush(someJob);
}