Я занимаюсь разработкой веб-приложения на Java, в котором мне нужно время от времени запускать некоторые задачи, одна из которых - рассчитать несколько часов полученной ссуды (которая хранится в базе данных), если эта ссуда уже имеет количество часов, прошедших с момента его создания, должна быть выполнена такая задача, как вставка данных в другую таблицу, уведомление пользователя и т. д.
Это первый раз, когда мне нужно сделать что-то подобное в Java Web, и я понятия не имею об этом (или, по крайней мере, это оптимально и безопасно), я знаю, что есть Timer и TimerTask
] Я пробовал следующее:
@Stateless
public class LoanBean{
Timer timer;
public LoanBean() {
checkLoans();
}
public void checkLoans() {
timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("Tarea ejecutándose");
}
};
timer.schedule(task, 10, 1000);
}
}
Кажется, что это хорошо работает в отношении того факта, что задача выполняется время от времени, но только при взаимодействии с этим EJB, идея состоит в том, что она будет выполняться, когда приложение смонтировано на сервер приложений, поскольку, если я перезапущу его, задача больше не будет выполняться до тех пор, пока я снова не буду взаимодействовать с этим EJB (откройте страницу в веб-браузере), в этом случае я использую Oracle WebLogic в качестве сервера приложений
quartz - cofigurable, но иногда способствует тому, чтобы был приведен к сбою твой сервер, с @Scheduled Спринг ты зависишь от внешних книжных магазинов, а следовательно я рекомендую тебе использовать классы самого Java и работать с MultiThreading Java
public class MiServicio extends TimerTask{
private Timer timer;
public MiServicio() {
timer = new Timer(true);// indicador de que es un daeomon para prioridad de ejecución
timer.scheduleAtFixedRate(this, 0, 4*60*60*1000); // ejecución inmediata y luego cada 4 horas
}
@Override
public void run() {
// ejecuta tu código de procesamiento
// valida tu condicion de salida y
timer.cancel(); // termina la ejecución periodica
}
}