Итак, я хочу запланировать задачу на определенное время, например, 7:15, и хочу выполнить ее один раз, я хочу работать с Quartz, но она заставляет задачу выполняться каждый период времени (например, 5 минут), но я не не хочу этого, я хочу запланировать задачу на основе реального времени. Спасибо
Как запланировать задачу на определенное время, например 7:15 утра
Ответы (4)
Пожалуйста, используйте выражение CronTrigger.eg: 0 15 07 * * *
и хочу выполнить его один раз,
Какой-то мой старый код, который запускает одноразовые запланированные задания
Calendar cal = Calendar.getInstance();
SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd");
cal.setTime(df.parse(job.getRunatDate()));
cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(job.getRunatHour()));
cal.set(Calendar.MINUTE, Integer.parseInt(job.getRunatMin()));
log.debug ("One-off job at " + cal.getTime());
Trigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
.withIdentity("trigger" + job.getLineNumber(), "group1")
.startAt(cal.getTime())
.build();
sched = new StdSchedulerFactory().getScheduler();
sched.start();
sched.scheduleJob(job, trigger);
изменить
Как упоминает Basic, здесь используются очень старые классы даты и времени, которые были заменены JSR310. Либо используйте его, либо Three10 Backport.
Получите текущий момент, как показано в желаемом часовом поясе.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdtNow = ZonedDateTime.now( z ) ;
Определите свое целевое время.
LocalTime targetTime = LocalTime.of( 7 , 15 ) ;
Сравните с текущим временем.
LocalTime timeNow = zdtNow.toLocalTime() ;
ZonedDateTime targetZdt = zdtNow.with( targetTime ) ;
if( ! timeNow.isbefore( targetTime ) )
{
targetZdt = targetZdt.plusDays( 1 ) ; // Auto-adjusts if this time of day is not valid on that date in that zone.
}
Подсчитайте время, прошедшее до этого момента.
Duration d = Duration.between( zdtNow , targetZdt ) ;
Используйте платформу Executors, чтобы запланировать свою задачу Runnable с однопоточным ScheduledExcutorService
после ожидания количества времени, указанного в Duration. Ищите переполнение стека, так как это обсуждалось много раз.
Спасибо, ребята, за помощь, я нашел ответ здесь:
Пример 1 CronTrigger — выражение для создания триггера, который просто срабатывает каждые 5 минут.
“0 0/5 * * * ?”
Пример 2 CronTrigger — выражение для создания триггера, который срабатывает каждые 5 минут через 10 секунд после минуты (т. е. 10:00:10, 10:05:10 и т. д.).
“10 0/5 * * * ?”
Пример CronTrigger 3 — выражение для создания триггера, который срабатывает в 10:30, 11:30, 12:30 и 13:30 каждую среду и пятницу.
«0 30 10–13 ? * СРЕДА, ПТ”
CronTrigger Пример 4 — выражение для создания триггера, который срабатывает каждые полчаса между 8:00 и 10:00 5-го и 20-го числа каждого месяца. Обратите внимание, что триггер НЕ сработает в 10:00, а только в 8:00, 8:30, 9:00 и 9:30.
“0 0/30 8-9 5,20 * ?”
Обратите внимание, что некоторые требования к расписанию слишком сложны, чтобы их можно было выразить с помощью одного триггера, например «каждые 5 минут с 9:00 до 10:00 и каждые 20 минут с 13:00 до 22:00». Решение в этом сценарии состоит в том, чтобы просто создать два триггера и зарегистрировать их оба для запуска одного и того же задания.