Как запустить задачу в течение определенного периода времени с ScheduledExecutorService? - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь создать запланированное задание, которое будет выполняться каждые 5 минут с 7:00 до 22:00 каждый день. Например, он должен работать в 7:00, 7:05, 7:10 ... 21:55, и тогда он должен остановиться в 22:00. На следующем он запускает тот же график снова и так далее.

Я нашел этот пример, который показывает, как использовать ScheduledExecutorService для запуска задачи в определенное время. Как запускать определенную задачу каждый день в определенное время, используя ScheduledExecutorService?

Я сослался на ответ и написал свой код, как показано ниже: (Я использую Java 7)

class Scheduler {
    private ScheduledExecutorService executors;

    public static void main(String[] arg) {
       Runnable task = new Runnable() {
            @Override
            public void run() {
                ...DO SOMETHING...
            }
       };

       // Get how many seconds before the next start time (7AM).
       long initDelay = getInitialDelay(7); 

       ScheduledExecutorService executors = Executors.newSingleThreadScheduledExecutor();
       executors.scheduleAtFixedRate(task, initDelay, (60 * 5), TimeUnit.SECONDS);
   }

    private static long getInitialDelay(int hour) {
        Calendar calNow = Calendar.getInstance();

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, hour);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);

        long diff = cal.getTimeInMillis() - calNow.getTimeInMillis();
        if (diff < 0) {
            cal.add(Calendar.DAY_OF_MONTH, 1);
            diff = cal.getTimeInMillis() - calNow.getTimeInMillis();
        }

        return diff / 1000;
    }
}

Мой код выше начинается в 7 часов утра и отлично работает каждые 5 минут. Тем не менее, как я могу управлять ScheduledExecuterService, чтобы остановить задачу в 22:00, а затем начать снова в 7:00 на следующий день?

Или есть ли какой-нибудь лучший способ выполнять задачу каждый день в определенный период времени?

1 Ответ

0 голосов
/ 28 марта 2019

Фиксированная служба по расписанию не может изменить время.

Так что используйте однократную нефиксированную службу запланированного исполнителя.Звоните ScheduledExecutorService::schedule.При первом запуске проверьте текущее время.Если до конца рабочего дня снова вызовите тот же метод schedule, передав задержку в пять минут.Если после окончания рабочего дня пройдет задержка в восемь часов, количество времени до начала нового рабочего дня.

Итак, простой маленький трюк.Каждый прогон вашего готового к запуску плана на следующий прогон бесконечен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...