Planowana Sposób samodzielnego stosowania w sprężynę

głosy
4

Mam metodę, która musi być wykonywana codziennie o 07:00. W tej materii stworzyłem Bean z metody i opatrzone go @Scheduled(cron=0 0 7 * * ?). W tym, że skrzynią fasoli w mainfunkcji - który zainicjalizuje kontekst sprężyny uzyskać ziarna i wywołać metody (co najmniej po raz pierwszy), na przykład:

public static void main(String[] args) {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(args[0]);
    SchedulerService schedulerService = context.getBean(SchedulerService.class);
    schedulerService.myMethod();
}

Działa to dobrze - ale tylko raz. Chyba rozumiem dlaczego - To dlatego, że maingwint kończy - i tak jest kontekst wiosna więc chociaż myMethodjest opatrzone @Scheduledprzyzwyczajenie pracy.

Myślałem o sposób przekazać to znaczenie - nie pozwól mainumrzeć wątek, może tak:

while (true){
   Thread.currentThread().sleep(500);
}

W ten sposób, myślę, że kontekst aplikacja pozostanie i tak jest moim fasoli.

Czy mam rację?

Czy istnieje lepszy sposób, aby rozwiązać ten problem?

Używam sprężynę 3.1.2.

Dzięki.

Utwórz 29/08/2012 o 10:31
użytkownik
W innych językach...                            


2 odpowiedzi

głosy
4

Główny gwint powinny pozostawać aktywny dopóki wszystkie wątki nie demon są żywe. Jeśli masz <task:annotation-driven/>tag w aplikacji następnie Wiosna powinna założyć wykonawcę z małym basenem wątków non-demon dla ciebie i skargi nie powinna wypowiedzieć.

Jedyną rzeczą, która musisz zrobić to zarejestrować hak zamykania także zapewnić oczyszczanie gdy VM kończy.

context.registerShutdownHook()

Odpowiedział 29/08/2012 o 19:00
źródło użytkownik

głosy
1

Łączenia metoda jest idealna do tego:

    try {
        Thread.currentThread().join();
    } catch (InterruptedException e) {
        logger.warn("Interrupted", e);
    }

Alternatywnie, tutaj jest stara metoda szkoła czekać:

    final Object sync = new Object();
    synchronized (sync) {
        try {
            sync.wait();
        } catch (InterruptedException e) {
            logger.warn("Interrupted", e);
        }
    }
Odpowiedział 29/08/2012 o 20:08
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more