Как я могу запустить мой TimerTask каждый день 2 PM
Я хочу выполнить работу каждый день 2 вечера.
Какой метод java.util.Timer
я могу использовать для планирования моей работы?
После 2Hrs Run он остановит работу и перенесет на следующий день 2PM.
Ответы
Ответ 1
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Timer;
import java.util.TimerTask;
public class MyTimerTask extends TimerTask {
private final static long ONCE_PER_DAY = 1000*60*60*24;
//private final static int ONE_DAY = 1;
private final static int TWO_AM = 2;
private final static int ZERO_MINUTES = 0;
@Override
public void run() {
long currennTime = System.currentTimeMillis();
long stopTime = currennTime + 2000;//provide the 2hrs time it should execute 1000*60*60*2
while(stopTime != System.currentTimeMillis()){
// Do your Job Here
System.out.println("Start Job"+stopTime);
System.out.println("End Job"+System.currentTimeMillis());
}
}
private static Date getTomorrowMorning2AM(){
Date date2am = new java.util.Date();
date2am.setHours(TWO_AM);
date2am.setMinutes(ZERO_MINUTES);
return date2am;
}
//call this method from your servlet init method
public static void startTask(){
MyTimerTask task = new MyTimerTask();
Timer timer = new Timer();
timer.schedule(task,getTomorrowMorning2AM(),1000*10);// for your case u need to give 1000*60*60*24
}
public static void main(String args[]){
startTask();
}
}
Ответ 2
Calendar today = Calendar.getInstance();
today.set(Calendar.HOUR_OF_DAY, 2);
today.set(Calendar.MINUTE, 0);
today.set(Calendar.SECOND, 0);
// every night at 2am you run your task
Timer timer = new Timer();
timer.schedule(new YourTask(), today.getTime(), TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS)); // period: 1 day
Ответ 3
Вы можете использовать метод Timer.schedule(TimerTask task, Date firstTime, long period)
, установив firstTime
в 2PM сегодня и настройку period
до 24 часов:
Запланирует указанную задачу для повторного выполнения с фиксированной задержкой, начиная с указанного времени. Последующие казни выполняются примерно через равные промежутки времени, разделенные на указанный период.
Ответ 4
Самый простой способ, которым я нашел это, всегда заключался в планировщике заданий в Windows и cron в Linux.
Однако для Java взгляните на Quartz Scheduler
На своем веб-сайте:
Quartz - полнофункциональная служба планирования заданий с открытым исходным кодом, которая может быть интегрированным с или использовать по существу практически любые Java EE или Java SE - от самого маленького автономного приложения до крупнейшей системы электронной коммерции. Кварц можно использовать для создания простых или сложные графики для выполнения десятков, сотен или даже десятки тысяч рабочих мест; задания, задачи которых определяются как стандартные Компоненты Java, которые могут выполнять практически все, что вы можете запрограммировать их делать. Планировщик Quartz включает в себя множество бизнес-классов таких как транзакции JTA и кластеризация.
Ответ 5
Вам следует попробовать использовать scheduleAtFixedRate (это повторит вашу задачу). Вам нужно будет создать объект TimerTask, который будет указывать, что нужно запускать (в run()) и при запуске (scheduleExecutionTime). scheduleAtFixedRate также позволяет указать первую дату выполнения.
Ответ 6
использовать публичное расписание void (задача TimerTask, дата firstTime, длительный период)
чтобы повторить задачу на следующий день, просто установите период на 86400000 миллисекунд (что означает 1 день)
Date date2pm = new java.util.Date();
date2pm.setHour(14);
date2pm.setMinutes(0);
Timer timer = new Timer();
timer.sc(myOwnTimerTask,date2pm, 86400000);
Ответ 7
Почему бы вам не использовать Spring @Scheduled (cron = "0 0 14 * * *" ).. для сек, мин, часов, дня, месяца, дняOfWeek. V Прохладный. Вы даже можете указать 9-11 для 9:00 - 11:00, или MON-FRI в последнем параметре.
Вы также можете запрограммировать это программно, как и в случае с большинством Spring, если вы хотите установить время во время выполнения.
Видеть это:-
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html
Добавление примера
@Scheduled(cron="0 0 14 * * *")
public void customScheduler(){
try{
// do what ever you want to run repeatedly
}catch(Exception e){
e.printStackTrace();
}
}
также прокомментируйте класс, содержащий это с помощью аннотации @Component, и представьте @EnableScheduling в классе Application.java(класс содержит основной метод), чтобы сделать Spring осведомленным о том, что вы используете taskcheduler в своем приложении.