Как запускать определенную задачу каждую пятницу в неделю в любое время, используя 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);
Другие вопросы по тегам