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

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

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

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

Таким образом, если время расписания 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);

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


person Guapo    schedule 24.02.2011    source источник
comment
возможный дубликат Запуск запланированной задачи, написанной на java на Linux-сервере   -  person MusiGenesis    schedule 24.02.2011
comment
это не проблема Linux, так что нет, это не дубликат. Задачи расписания - это функция в приложении, которую мне нужно обрабатывать с помощью самого кода Java, а не с помощью cronjob.   -  person Guapo    schedule 24.02.2011


Ответы (2)


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

Взгляните на эту ссылку: http://www.ibm.com/developerworks/java/library/j-schedule.html

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

person Favonius    schedule 24.02.2011
comment
спасибо, я проверю это, чтобы увидеть, поможет ли это мне, но java не очень мой пляж. - person Guapo; 24.02.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 часа.

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

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

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

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

person MusiGenesis    schedule 24.02.2011
comment
дело в расписании, например, запускать каждый день в 13 часов дня, поэтому при запуске приложения оно будет автоматически планировать настроенное время. - person Guapo; 24.02.2011
comment
Я только что обновил свой ответ об этом. Можете ли вы добавить, на какой платформе вы работаете? Если это Blackberry, я мог бы вам помочь - в противном случае здесь скрывается больше, чем несколько экспертов по Java. :) - person MusiGenesis; 24.02.2011
comment
это приложение, которое работает в Linux, это сервер-менеджер. - person Guapo; 24.02.2011