2011-08-06 18 views
13

Jestem stosunkowo nowy w Javie i wybrałem projekt, nad którym można pracować. Jednak natknąłem się na blok. Potrzebuję metody, aby biegać o określonych porach w ciągu dnia. Zrobiłem sporo poszukiwań, ale nie mogę znaleźć niczego, co wydaje się, że to wystarczy. Wpadłem na klasę Timer, ale wydaje się, że działa w określonych odstępach czasu. Wygląda na to, że klasa Scheduler ma ten sam problem. Natknąłem się również na Quartz, ale myślę, że potrzebuję czegoś bardziej lekkiego i mogłem tylko zobaczyć, jak robić rzeczy w odstępach czasu.Uruchamianie metody Java o określonej godzinie każdego dnia

Może dlatego, że jestem nowy, przegapiłem kilka rzeczy, które mogą mi pomóc w tych zajęciach, ale naprawdę utknąłem i mogłem skorzystać z pomocy.

Jeśli ktoś może wskazać mi klasę, która uruchomi coś o określonej porze dnia, codziennie (punkty bonusowe za możliwość anulowania wydarzenia) i pokaże mi, jak poprawnie używać klasy, będzie to niesamowite !

TL; DR: Wymagana jest klasa, która robi coś o określonej porze dnia, a nie z przerwą, ponieważ program może zostać uruchomiony ponownie kilka razy w ciągu dnia.

+2

Napisałem postu ponownej oceny tego punktu. To może pomóc: http://harryjoy.wordpress.com/2011/07/09/create-a-scheduler-task-in-java/ –

+0

@ Harry Joy, które było pomocne. Nie wiedziałem o Quartz –

Odpowiedz

26

spróbować klasę TimerTask

uzyskać więcej informacji sprawdź 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 
+3

+1: Uwielbiam również kwarc. Ale użycie go do rozpoczęcia zadania z cronem powoduje, że ponosisz odpowiedzialność za to, że aplikacja nigdy się nie zawiesza, automatycznie uruchamia się ponownie, jeśli nadal się zawiesza, itp. – Daniel

+2

Pamiętaj, że jest to zepsute po zmianie czasu letniego! Czasomierz będzie działać godzinę później lub szybko, tutaj o 1:00 lub 23:00 (w zależności od tego, czy został uruchomiony w lecie i przechodzi na zimę, czy na odwrót). – Philipp

+0

Dodałem date.set (Calendar.AM_PM, Calendar.AM); lub PM, aby działał dokładnie w czasie, którego się spodziewałem. –

4

Sugeruję, jeśli to w ogóle możliwe, że najlepszym sposobem byłoby wywołanie skryptu lub aplikacji Java za pomocą programu planującego systemu operacyjnego: na przykład "cron" w * nix lub "scheduler zadań" w systemie Windows .

+0

Chciałbym dodać tę sugestię. Po co ponownie wdrażać wszystko i martwić się zarządzaniem aplikacją Java? @Eegabooga czy naprawdę to zrobiłeś w Javie? Rozwiązania lightweight mogą być implementowane, jeśli ich potrzebujesz, ale one często się zmieniają i prawdopodobnie nie będą tak mocne. –

+0

Dziękuję wszystkim za odpowiedzi. Jednak jestem prawie w 100% pewien, że musi to być w Javie. To nie jest program, który wymaga ponownego uruchomienia w określonym czasie każdego dnia, to działanie, które program wykonuje. Nawet jeśli Cron mógłby to zrobić, ten program nie jest dla mnie, ale dla kogoś innego. To, co robię, to wtyczka do serwera gry i wtyczka podpina serwer tego gościa. Gdyby było to możliwe, mógłbym wysłać mu pliki crona, których by potrzebował, gdybyś myślał, że to zadziała, ale pamiętaj, że potrzebuję metody do uruchomienia w programie, a nie samego programu (przykro, jeśli składnia jest zła, wciąż się uczę) –

+0

Ok Widzę teraz, że mogę uruchomić cronjob przez Java z Quartz. –

2

Jedną z możliwości mogłoby być użycie zewnętrznego scheduler - w zależności od żądanej dokładności. W UNIX użyj CRON, w Windows użyj Windows Scheduler. To ładnie izoluje czas od zrobienia.

Można użyć zegara i utworzyć prostą klasę, która sprawdza czas co minutę lub 5 minut w zależności od pożądanej ziarnistości. Byłby bardzo lekki.

Powiązane problemy