Unhandled exceptions with Java scheduled executors

Mam następujący problem i chciałbym wiedzieć, co dokładnie się dzieje. Używam Java ScheduledExecutorService do uruchamiania zadania co pięć minut. Działa bardzo dobrze. Executorzy całkowicie zmienili sposób programowania wątków w Javie.

Teraz przeglądałem Java Doc, aby uzyskać informacje o tym, jakie będzie zachowanie w przypadku niepowodzenia zaplanowanego zadania z nieobsługiwanym wyjątkiem, ale nie mogłem nic znaleźć.

Czy następne zaplanowane zadanie nadal będzie działać? Jeśli istnieje nieobsługiwany wyjątek, zaplanowany wykonawca zatrzymuje zadanie planowania? Czy ktoś może wskazać informacje dotyczące tego prostego problemu?

Wielkie dzięki.

Author: Pablo Santa Cruz, 2009-11-02

4 answers

Javadoc zarówno scheduleAtFixedRate jak i scheduleWithFixedDelay mówi: "Jeśli jakakolwiek realizacja zadania napotka wyjątek, kolejne egzekucje są tłumione."Nie uważam, aby było to dokładnie jasne, ale wydaje się, że jeśli twoja metoda run rzuci jakikolwiek wyjątek, wtedy scheduler skutecznie zrezygnuje z tego zadania. Nie powinno to mieć wpływu na inne zadania uruchamiane za pośrednictwem tego harmonogramu. Nie powinno być trudno sprawdzić, co naprawdę robi...

Anulowanie zadania nie może to musi być coś złego. Jeśli metoda run rzuca RuntimeException, prawdopodobnie ma gdzieś błąd, a stan systemu jest nieznany. Ale przynajmniej radziłbym złapać RuntimeException w Twojej metodzie biegu i zarejestrować pełny ślad stosu w SEVERE. W zależności od okoliczności możesz anulować zadanie. Ale tak czy inaczej będziesz potrzebował logowania, aby mieć szansę na znalezienie tego, co poszło nie tak.

 27
Author: Lachlan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-02 12:11:40

Jeśli używasz scheduleAtFixedRate() LUB scheduleAtFixedDelay(), A Twoje zadanie wykupi się z wyjątkiem, to zadanie nie zostanie przełożone. Jednak inne niezależne zadania powinny nadal wykonywać zgodnie z oczekiwaniami. (Zobacz API Docs). Jeśli zależy ci na tym, że tak się stało, możesz złapać ScheduledFuture, który jest zwracany i wywołać metodę get(). Jeśli podstawowe zadanie wyrzuci wyjątek, zostanie on wyrzucony z metody get(), owinięty w ExecutionException.

 12
Author: andersoj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-02 12:19:35

Ten człowiek miał ten sam problem.

Http://code.nomad-labs.com/2011/12/09/mother-fk-the-scheduledexecutorservice/

Jego rozwiązaniem jest złapanie Exception wewnątrz runnable i ponowne rzucenie RuntimeException:

try {
       theRunnable.run();
    } catch (Exception e) {
       // LOG IT HERE!!!
       System.err.println("error in executing: " + theRunnable + ". It will no longer be run!");
       e.printStackTrace();

       // and re throw it so that the Executor also gets this error so that it can do what it would
       // usually do
       throw new RuntimeException(e);
}
 2
Author: mrclrchtr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-22 07:07:12

Wygląda na to, że API nie definiuje żadnego konkretnego mechanizmu obsługi wyjątków. Tzn. uncaught wyjątek po prostu wyskakuje przez ramki wątku i w końcu jest zalogowany do stderr.

Widzę, że możesz wykorzystać następujące strategie obsługi wyjątków:

 -3
Author: denis.zhdanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-02 12:14:00