Как запускать определенную задачу каждую пятницу в неделю в любое время, используя ScheduledExecutorService?
Я пытаюсь выполнить определенную задачу каждую пятницу в неделю в любое время. Поэтому я решил использовать ScheduledExecutorService
для этого, но до сих пор я видел примеры, которые показывают, как запускать задачу каждые несколько минут.
Ниже приведен мой кодекс, который я принимал каждый день в 5 часов утра. Как я могу использовать это для запуска задачи каждую пятницу в неделю в любое время?
public static void main(String[] args) {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(5);
Date aDate = new Date();
Calendar with = Calendar.getInstance();
with.setTime(aDate);
int hour = with.get(Calendar.HOUR_OF_DAY);
int intDelayInHour = hour < 5 ? 5 - hour : 24 - (hour - 5);
System.out.println("Current Hour: " + hour);
System.out.println("Comuted Delay for next 5 AM: " + intDelayInHour);
scheduler.scheduleAtFixedRate(new Runnable() {
public void run() {
try {
getDataFromDatabase();
} catch (Exception ex) {
ex.printStackTrace(); // or loggger would be better
}
}
}, intDelayInHour, 24, TimeUnit.HOURS);
}
protected static void getDataFromDatabase() {
// TODO Auto-generated method stub
}
Кто-нибудь может привести пример, как бы я это сделал?
2 ответа
Вы должны проверить, какой сегодня день.
Затем установите задержку на следующую пятницу (допустим, это вторник, затем установите 3-дневную задержку или используйте часы, если вы хотите установить другое время).
А затем используйте 7-дневный период (или эквивалентно в часах).
РЕДАКТИРОВАТЬ:
По запросу вы можете сделать что-то вроде.
Map<Integer, Integer> dayToDelay = new HashMap<Integer, Integer>()
dayToDelay.put(Calendar.FRIDAY, 0);
dayToDelay.put(Calendar.SATURDAY, 6);
dayToDelay.put(Calendar.SUNDAY, 5);
dayToDelay.put(Calendar.MONDAY, 4);
dayToDelay.put(Calendar.TUESDAY, 3);
dayToDelay.put(Calendar.WEDNESDAY, 2);
dayToDelay.put(Calendar.THURSDAY, 1);
int dayOfWeek = with.get(DAY_OF_WEEK);
int delayInDays = dayToDelay.get(dayOfWeek);
scheduler.scheduleAtFixedRate(new Runnable() {
public void run() {
try {
getDataFromDatabase();
} catch (Exception ex) {
ex.printStackTrace(); // or loggger would be better
}
}
}, delayInDays, 7, TimeUnit.DAYS);
Это должно запускать задачу каждую пятницу во время выполнения.
Запускать программу каждый понедельник в 11 часов
public static void main(String args[]){
new WeeklyReportService();
}
WeeklyReportService.java
public class WeeklyReportService{
public WeeklyReportService(){
this.startScheduler();
}
private void startScheduler(){
Calendar with = Calendar.getInstance();
Map<Integer, Integer> dayToDelay = new HashMap<Integer, Integer>();
dayToDelay.put(Calendar.FRIDAY, 2);
dayToDelay.put(Calendar.SATURDAY, 1);
dayToDelay.put(Calendar.SUNDAY, 0);
dayToDelay.put(Calendar.MONDAY, 6);
dayToDelay.put(Calendar.TUESDAY, 5);
dayToDelay.put(Calendar.WEDNESDAY, 4);
dayToDelay.put(Calendar.THURSDAY, 3);
int dayOfWeek = with.get(Calendar.DAY_OF_WEEK);
int hour = with.get(Calendar.HOUR_OF_DAY);
int delayInDays = dayToDelay.get(dayOfWeek);
int delayInHours = 0;
if(delayInDays == 6 && hour<11){
delayInHours = 11 - hour;
}else{
delayInHours = delayInDays*24+((24-hour)+11);
}
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(new WeeklyTask(), delayInHours,
179, TimeUnit.HOURS);
}
WeeklyTask.java
Public class WeeklyTask implements Runnable {
@Override
public void run() {
System.out.println("start of weekly report");
/*Your Program to run*/
System.out.println("end of weekly report");
}
}
Надеюсь это поможет! Вы можете применить то же самое в любой день. В вашем случае на пятницу 11 утра будет
dayToDelay.put(Calendar.FRIDAY, 6);
dayToDelay.put(Calendar.SATURDAY, 5);
dayToDelay.put(Calendar.SUNDAY, 4);
dayToDelay.put(Calendar.MONDAY, 3);
dayToDelay.put(Calendar.TUESDAY, 2);
dayToDelay.put(Calendar.WEDNESDAY, 1);
dayToDelay.put(Calendar.THURSDAY, 0);