Я хочу выполнить работу каждый день 2 вечера.
Какой метод java.util.Timer
я могу использовать для планирования моей работы?
После 2Hrs Run он остановит работу и перенесет на следующий день 2PM.
Я хочу выполнить работу каждый день 2 вечера.
Какой метод java.util.Timer
я могу использовать для планирования моей работы?
После 2Hrs Run он остановит работу и перенесет на следующий день 2PM.
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();
}
}
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
Вы можете использовать метод Timer.schedule(TimerTask task, Date firstTime, long period)
, установив firstTime
в 2PM сегодня и настройку period
до 24 часов:
Запланирует указанную задачу для повторного выполнения с фиксированной задержкой, начиная с указанного времени. Последующие казни выполняются примерно через равные промежутки времени, разделенные на указанный период.
Самый простой способ, которым я нашел это, всегда заключался в планировщике заданий в Windows и cron в Linux.
Однако для Java взгляните на Quartz Scheduler
На своем веб-сайте:
Quartz - полнофункциональная служба планирования заданий с открытым исходным кодом, которая может быть интегрированным с или использовать по существу практически любые Java EE или Java SE - от самого маленького автономного приложения до крупнейшей системы электронной коммерции. Кварц можно использовать для создания простых или сложные графики для выполнения десятков, сотен или даже десятки тысяч рабочих мест; задания, задачи которых определяются как стандартные Компоненты Java, которые могут выполнять практически все, что вы можете запрограммировать их делать. Планировщик Quartz включает в себя множество бизнес-классов таких как транзакции JTA и кластеризация.
Вам следует попробовать использовать scheduleAtFixedRate (это повторит вашу задачу). Вам нужно будет создать объект TimerTask, который будет указывать, что нужно запускать (в run()) и при запуске (scheduleExecutionTime). scheduleAtFixedRate также позволяет указать первую дату выполнения.
использовать публичное расписание 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);
Почему бы вам не использовать 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 в своем приложении.