¿Hay alguna solución simple para guardar datos en la base de datos usando JPA en un nuevo hilo?Llamando a los métodos @Transactional desde otro hilo (Ejecutable)
La aplicación web My Spring permite al usuario administrar tareas programadas. En tiempo de ejecución, puede crear e iniciar nuevas instancias de tareas predefinidas. Estoy usando TaskScheduler de primavera y todo funciona bien.
Pero necesito guardar el resultado booleano de cada tarea disparada en la base de datos. ¿Cómo puedo hacer esto?
EDIT: Tengo que generalizar mi pregunta: Necesito llamar a un método en mi clase @Service desde las tareas. Porque el resultado de la tarea debe ser "procesado" antes de guardarlo en la base de datos.
EDIT 2: La versión simplificada de mi código problemático viene aquí. Cuando se llama a saveTaskResult() desde el programador, el mensaje se imprime pero no se guarda nada en db. Pero cada vez que llamo a saveTaskResult() desde el controlador, el registro se guarda correctamente en la base de datos.
@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);
}
}
¿Cuál es exactamente el problema? Inicia un hilo, llama a sus servicios de Spring exactamente como lo hubiera hecho si no hubiera iniciado un hilo, y todo debería estar bien. –
El problema es que el método de negocio objetivo es @Transactional. Cuando llamo a este método en run(), los datos no se conservan. (He actualizado el título de la pregunta) –
Al interceptor transaccional no le importa si el hilo que llama al método es un hilo creado por su contenedor de servlets, o un hilo creado por usted. Deberia de funcionar. Muéstranos un código. –