Есть ли какое-нибудь простое решение для сохранения данных в базу данных с использованием JPA в новом потоке?Вызов методов @Transactional из другого потока (Runnable)
Мое приложение на основе Spring позволяет пользователю управлять запланированными задачами. Во время выполнения он может создавать и запускать новые экземпляры предопределенных задач. Я использую Spring TaskScheduler, и все работает хорошо.
Но мне нужно сохранить логический результат каждой заданной задачи в базу данных. Как я могу это сделать?
EDIT: Я должен обобщать свой вопрос: мне нужно вызвать метод из моего класса @Service из задач. Потому что результат задачи должен быть «обработан» перед сохранением в базе данных.
EDIT 2: Упрощенная версия моего проблемного кода приходит сюда. Когда saveTaskResult() вызывается из планировщика, сообщение распечатывается, но ничего не сохраняется в db. Но всякий раз, когда я вызываю saveTaskResult() из контроллера, запись корректно сохраняется в базе данных.
@Service
public class DemoService {
@Autowired
private TaskResultDao taskResultDao;
@Autowired
private TaskScheduler scheduler;
public void scheduleNewTask() {
scheduler.scheduleWithFixedDelay(new Runnable() {
public void run() {
// do some action here
saveTaskResult(new TaskResult("result"));
}
}, 1000L);
}
@Transactional
public void saveTaskResult(TaskResult result) {
System.out.println("saving task result");
taskResultDao.persist(result);
}
}
В чем же проблема? Вы начинаете поток, вы называете свои службы Spring именно так, как вы бы это сделали, если бы вы не начали нить, и все должно быть в порядке. –
Проблема заключается в целевом бизнес-методе @Transactional. Когда я вызываю этот метод в run(), данные не сохраняются. (Я обновил заголовок вопроса) –
Транзакционному перехватчику все равно, является ли поток, вызывающий метод, потоком, созданным вашим контейнером сервлетов, или потоком, созданным вами. Он должен работать. Покажите нам какой-то код. –