Wywoływanie metod @Transactional z innego wątku (Runnable)
Czy istnieje proste rozwiązanie do zapisywania danych w bazie danych przy użyciu JPA w nowym wątku?
Moja aplikacja internetowa na wiosnę pozwala użytkownikowi zarządzać zaplanowanymi zadaniami. W czasie wykonywania może tworzyć i uruchamiać nowe wystąpienia predefiniowanych zadań. Używam sprężynowego TaskSchedulera i wszystko działa dobrze.
Ale muszę zapisać wynik logiczny każdego uruchomionego zadania w bazie danych. Jak mogę to zrobić?
EDYCJA: Muszę uogólnić moje pytanie: muszę wywołać metodę w mojej klasie @Service z zadań. Ponieważ wynik zadania musi być „przetworzony” przed zapisaniem w bazie danych.
EDIT 2: Uproszczona wersja mojego problematycznego kodu jest dostępna tutaj. Gdy saveTaskResult () jest wywoływany z programu planującego, komunikat jest drukowany, ale nic nie jest zapisywane w db. Ale ilekroć wywołam saveTaskResult () z kontrolera, zapis jest poprawnie zapisywany w bazie danych.
@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);
}
}