Запуск метода Java в установленное время каждый день

Я относительно новичок в Java, и я выбрал проект для работы. Тем не менее, я столкнулся с блоком. Мне нужен метод для запуска в определенное время в течение дня. Я проделал довольно много поисков, но не могу найти ничего, что могло бы помочь. Я столкнулся с классом Timer, но, похоже, он запускается через определенные промежутки времени. У класса Scheduler возникла та же проблема. Я также столкнулся с Quartz, но я думаю, что мне нужно что-то более легкое, и я мог видеть, как что-то делать только через определенные промежутки времени.

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

Если бы кто-нибудь мог указать мне на класс, который будет запускать что-то в определенное время дня, каждый день (бонусные баллы за возможность отменить событие), и показать мне, как правильно использовать класс, это было бы здорово!

TL;DR: нужен класс, который делает что-то в определенное время дня, а не с интервалом, потому что программа может перезапускаться несколько раз в течение дня.


person Austin Moore    schedule 06.08.2011    source источник
comment
Я написал пост с переоценкой этого пункта. Это может вам помочь: harryjoy.wordpress .com/2011/07/09/   -  person Harry Joy    schedule 06.08.2011
comment
@ Гарри Джой, это было полезно. про кварц не знал   -  person Suhail Gupta    schedule 06.08.2011


Ответы (3)


попробуйте класс TimerTask

для получения дополнительной информации посетите http://oreilly.com/java/archive/quartz.html

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class ReportGenerator extends TimerTask {

  public void run() {
    System.out.println("Generating report");
    //TODO generate report
  }

}

class MainApplication {

  public static void main(String[] args) {
    Timer timer = new Timer();
    Calendar date = Calendar.getInstance();
    date.set(
      Calendar.DAY_OF_WEEK,
      Calendar.SUNDAY
    );
    date.set(Calendar.HOUR, 0);
    date.set(Calendar.MINUTE, 0);
    date.set(Calendar.SECOND, 0);
    date.set(Calendar.MILLISECOND, 0);
    // Schedule to run every Sunday in midnight
    timer.schedule(
      new ReportGenerator(),
      date.getTime(),
      1000 * 60 * 60 * 24 * 7
    );
  }//Main method ends
}//MainApplication ends
person dov.amir    schedule 06.08.2011
comment
+1: я тоже люблю кварц. Но использование его вместо запуска задачи с помощью cron возлагает на вас ответственность за то, чтобы приложение никогда не вылетало, автоматически перезапускалось, если оно все еще вылетало, и т. д. - person Daniel; 06.08.2011
comment
Обратите внимание, что это не работает после изменения летнего времени! Затем таймер будет работать на один час позже или быстрее, здесь в 1:00 или 23:00 (в зависимости от того, был ли он запущен летом и переходит на зимнее время или наоборот). - person Philipp; 12.09.2013
comment
Я добавил date.set(Calendar.AM_PM, Calendar.AM); или PM, чтобы заставить его работать в точное время, которое я ожидал. - person Valerio Emanuele; 13.09.2013
comment
Да, date.set(Calendar.HOUR, 0); должно быть date.set(Calendar.HOUR_OF_DAY, 0); если вы используете 24-часовой формат - person perzsa; 16.08.2017

Я настоятельно рекомендую, если это вообще возможно, что лучшим подходом будет запуск вашего скрипта или Java-приложения с помощью планировщика вашей ОС: например, «cron» в * nix или «планировщик задач» в Windows.

person paulsm4    schedule 06.08.2011
comment
Я бы поддержал это предложение. Зачем все заново реализовывать и вообще беспокоиться об управлении Java-приложением? @Eegabooga Вам действительно нужно это на Java? Облегченные решения могут быть реализованы, если они вам нужны, но они многое изобретают заново и, вероятно, не будут такими надежными. - person Ray Toal; 06.08.2011
comment
Спасибо всем за ваши ответы. Однако я почти на 100% уверен, что это должно быть в Java. Это не программа, которую нужно перезапускать в определенное время каждый день, это действие, которое программа выполняет. Даже если бы cron мог это сделать, эта программа не для меня, а для кого-то другого. Я делаю плагин для игрового сервера, и этот плагин подключается к серверу этого парня. Если это возможно, я мог бы отправить ему файлы cron, которые ему понадобятся, если вы думаете, что это сработает, но помните, что мне нужен метод для запуска в программе, а не в самой программе (извините, если синтаксис неправильный, все еще учусь) - person Austin Moore; 06.08.2011
comment
Хорошо, теперь я вижу, что могу запустить cronjob через Java с помощью Quartz. - person Austin Moore; 06.08.2011

Одной из возможностей может быть использование внешнего планировщика - в зависимости от желаемой точности. В UNIX используйте CRON, в Windows используйте планировщик Windows. Это хорошо изолирует время от делания.

Вы можете использовать таймер и создать простой класс, который проверяет время каждую минуту или 5 минут в зависимости от желаемой степени детализации. Было бы очень легко.

person Richard Corfield    schedule 06.08.2011