Domanda

Ho il seguente problema e vorrei sapere cosa succede esattamente. Sto usando ScheduledExecutorService per eseguire un compito ogni cinque minuti. Funziona molto bene. Esecutori completamente cambiato il mio modo di fare programmazione filo in Java.

Ora, ho passato in rassegna Java Doc per informazioni su quello che sarebbe stato il comportamento nel caso in cui l'operazione pianificata non riesce con un'eccezione non gestita, ma non ho trovato nulla.

E 'il prossimo compito in programma ancora in corso di esecuzione? Se v'è un'eccezione non gestita, l'esecutore in programma smette di pianificazione delle attività? Chiunque può puntare a informazioni riguardanti questo semplice problema?

Grazie mille.

È stato utile?

Soluzione

Il Javadoc sia scheduleAtFixedRate e scheduleWithFixedDelay dice "Se un'esecuzione del compito rileva un'eccezione, esecuzioni successive vengono soppressi." Non trovo che, per essere esattamente cristallina, ma sembra voler dire che se il metodo run getta alcun tipo di eccezione, allora lo scheduler efficacemente goccia che compito. Eventuali altre attività in esecuzione tramite scheduler che non dovrebbero essere interessati. Non dovrebbe essere difficile per testare ciò che realmente fa ...

L'annullamento del compito non può essere necessariamente una cosa negativa. Se il metodo di esecuzione getta un RuntimeException, probabilmente ha un bug da qualche parte, e lo stato del sistema è sconosciuta. Ma come minimo mi sento di consigliare la cattura RuntimeException nel metodo di esecuzione e la registrazione della traccia completa stack GRAVE. Si consiglia di rigenerare poi per annullare l'operazione, a seconda delle circostanze. Ma in entrambi i casi è necessario il logging di avere una possibilità di combattere di capire di che cosa è andato storto.

Altri suggerimenti

Se si utilizza scheduleAtFixedRate() o scheduleAtFixedDelay(), e il vostro compito balle con un'eccezione, che il compito non sarà riprogrammata. Tuttavia, altre attività indipendenti dovrebbero continuare ad eseguire come previsto. (Vedere Documentazione API ). Se vi preoccupate che questo è successo, si può afferrare ahold del ScheduledFuture che viene restituito e chiamare il metodo get(). Se l'attività sottostante lancia un'eccezione, si otterrà è gettato fuori del metodo get(), avvolto in un ExecutionException.

Questo uomo ha avuto lo stesso problema.

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

La sua soluzione è quello di catturare Exception all'interno del eseguibile e ri gettare un 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);
}

Sembra che l'API non definisce alcun meccanismo di gestione delle eccezioni specifiche. Cioè eccezione non identificata si apre solo attraverso le cornici filo e, infine, viene registrato a stderr.

Vedo che è possibile sfruttare le seguenti strategie di gestione delle eccezioni:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top