Как запланировать задачу на определенное время, например 7:15 утра

Итак, я хочу запланировать задачу на определенное время, например, 7:15, и хочу выполнить ее один раз, я хочу работать с Quartz, но она заставляет задачу выполняться каждый период времени (например, 5 минут), но я не не хочу этого, я хочу запланировать задачу на основе реального времени. Спасибо


person Foued Sedrati    schedule 15.08.2019    source источник
comment
Что вы подразумеваете под выполнением один раз? Только в это время завтра, а не после?   -  person    schedule 15.08.2019
comment
Взгляните на quartz-scheduler. org/documentation/quartz-2.3.0/tutorials/   -  person    schedule 15.08.2019
comment
я имею в виду, что я хочу выполнить его 1 раз (не повторно).   -  person Foued Sedrati    schedule 15.08.2019
comment
Только один раз, больше никогда?   -  person    schedule 15.08.2019
comment
извините, я проверил свою программу, и мне нужно, чтобы она запускалась каждый день, поэтому проблема решена, спасибо   -  person Foued Sedrati    schedule 15.08.2019


Ответы (4)


Пожалуйста, используйте выражение CronTrigger.eg: 0 15 07 * * *

person Mr.zhu    schedule 15.08.2019
comment
Можете ли вы объяснить это дальше? Как это выражение CronTrigger гарантирует, что задача будет запущена ровно один раз? - person Nico Haase; 15.08.2019

и хочу выполнить его один раз,

Какой-то мой старый код, который запускает одноразовые запланированные задания

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.

person Scary Wombat    schedule 15.08.2019
comment
Эти ужасные классы даты и времени были вытеснены много лет назад классами java.time с принятием JSR 310. - person Basil Bourque; 15.08.2019
comment
@BasilBourque Да, я упоминал, что это старый код. 2014 год, если это оправдание. - person Scary Wombat; 15.08.2019

Получите текущий момент, как показано в желаемом часовом поясе.

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. Ищите переполнение стека, так как это обсуждалось много раз.

person Basil Bourque    schedule 15.08.2019

Спасибо, ребята, за помощь, я нашел ответ здесь:

Пример 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». Решение в этом сценарии состоит в том, чтобы просто создать два триггера и зарегистрировать их оба для запуска одного и того же задания.

person Foued Sedrati    schedule 15.08.2019