запустить программу на Java в определенное время - PullRequest
0 голосов
/ 01 июня 2011

Мне нужна помощь для запуска моей Java-программы на сервере в определенное время, например 14:00 (для индексации новых файлов).

Кто-то сказал мне, что в Java есть нечто, называемое заданиями, но я не знаю, как с этим работать. Я попробовал это:

 boolean cond=true;
 while(cond){
     @SuppressWarnings("deprecation")
     int heur = new Date().getHours();
     @SuppressWarnings("deprecation")
     int minute= new Date().getMinutes();
     if(heur==16 && minute==02){
         indexer.close();
         end = new Date().getTime();
         File f;
         cond=false;
     }

Но с этим программа все еще работает.

Как я могу запустить свою программу в указанное время?

Ответы [ 2 ]

3 голосов
/ 01 июня 2011

Theres API под названием Quartz , именно здесь ваша программа может запланировать «задания», и она будет запускаться в это время.

Пока я не смогу привести пример, попробуйте эту ссылку .

Редактировать: Сначала необходимо создать класс, который реализует org.quartz.Job.Когда вы реализуете это, вам нужно будет реализовать метод execute(JobExecutionContext jobExecution), который будет запускаться при срабатывании «триггера».

Для настройки расписания:

SchedulerFactory schedulerFactory = new StdSchedulerFactory();
// Retrieve a scheduler from schedule factory
Scheduler scheduler = null;
try {
    scheduler = schedulerFactory.getScheduler();
}
catch (SchedulerException e) {
    e.printStackTrace();
}

//Set up detail about the job 
JobDetail jobDetail = new JobDetail("jobDetail", "jobDetailGroup", ImplementedJob.class);
SimpleTrigger simpleTrigger = new SimpleTrigger("Trigger Name","defaultGroup", DATE);

// schedule a job with JobDetail and Trigger
scheduler.scheduleJob(jobDetail, simpleTrigger);
// start the scheduler
scheduler.start();
2 голосов
/ 01 июня 2011

В цикле нет вызова Thread.sleep(), поэтому он будет "вращаться" при 100% CPU (не очень хорошо), но в любом случае это плохой дизайн.Большим улучшением было бы просто вычислить количество миллисекунд между «сейчас» и когда вы хотите, чтобы оно выполнялось, затем вызвать Thread.sleep (n).

Однако лучшее решение - использовать то, что JDKуже предоставляет.

Посмотрите на этот код, который использует классы из библиотеки JDK concurrent .Это очень простой пример, который будет работать:

import java.util.concurrent.*;

public static void main(String[] args)
{
    ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
    Runnable runnable = new Runnable() {
        public void run()
        {
            // do something;
        }
    };

    // Run it in 8 hours - you would have to calculate how long to wait from "now"
    service.schedule(runnable, 8, TimeUnit.HOURS); // You can 
}
...