управление расписанием - PullRequest
       12

управление расписанием

1 голос
/ 24 февраля 2011

Наконец, после некоторых проб и ошибок, мне удалось заставить его работать так, как я хотел.

Но теперь я хотел бы, чтобы вы посоветовали сделать код более читабельным и простым, кажется, он сделал много ненужного кодазаархивировать то, что я хотел.

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

Так что, если время по расписанию 13:00:00 и должно работать в течение 120 минут, а приложение запускается в 13: 30 он будет работать в течение 90 минут.Если вы запустите его после этого времени, оно будет обычно запланировано на следующий день 13: 00: 00.

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

        long start_time = calendar.getTimeInMillis() - System.currentTimeMillis();

        if (start_time < 0)
        {
            long minutes = (start_time*-1) / (60 * 1000);
            if (minutes > 0 && minutes < 120)
            {
                runTimeLeft = 120 - minutes;
                ThreadPoolManager.getInstance().schedule(new Runnable()
                {
                    public void run()
                    {
                        myTask();
                    }
                }, 0);
            }
            else
                runTimeLeft = 0;

            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.HOUR_OF_DAY, hour+24);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);

            start_time = calendar.getTimeInMillis() - System.currentTimeMillis();
        }

        ThreadPoolManager.getInstance().scheduleAtFixedRate(new Runnable()
        {
            public void run()
            {
                myTask();
            }
        }, start_time, 24 * 60 * 60 * 1000);

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

Ответы [ 2 ]

0 голосов
/ 24 февраля 2011

Используйте это вместо первого метода:

int interval = 24 * 60 * 60 * 1000; // might be long instead of int
ThreadPoolManager.getInstance().scheduleAtFixedRate(new Runnable()
{
    public void run()
    {
        myTask();
    }
}, interval, interval);

Это создаст простой таймер, который будет вызывать myTask() через 24 часа, а затем каждые 24 часа после.

ВашДругое требование немного другое, хотя.Если я правильно понимаю ваше описание, вы, в основном, хотите, чтобы ваше приложение всегда выполняло какую-то задачу в 12:00, если оно работает.Если вам не нужна точность с точностью до миллисекунды, вы можете добиться этого очень просто, запустив таймер с периодом в одну минуту и ​​проверяя текущее системное время в каждом тике - когда вы нажимаете 12:00.выполняйте свои ежедневные задачи.

Более изощренный способ предполагает взаимодействие с ОС таким образом, чтобы он выполнял обратные вызовы для вашего приложения в заранее запланированное время (возможно, даже запуская ваше приложение в случае необходимости), но такого рода вещами является ОС/ для конкретной платформы (которую вы не указали).

Обновление: Я ничего не знаю о Linux, но похоже, что вам нужна работа cron.См. Этот вопрос:

Запуск запланированной задачи, написанной на Java, на сервере Linux

0 голосов
/ 24 февраля 2011

Вместо использования java.util.Timer, попробуйте использовать его с TimerTask.На эту тему есть хорошая статья от IBM.

Посмотрите по этой ссылке: http://www.ibm.com/developerworks/java/library/j-schedule.html

Код также используется совместно и, кажется, работает для тривиальной рутинной работы.

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