2014-10-23 25 views
11

Nel mio caso è necessario eseguire alcune attività pianificate (ad esempio ogni minuto) eseguendo alcuni controlli in DB e, se necessario, alcune attività secondarie. Questo dovrebbe essere nessun controllo sanitario del DB!Dropwizard ScheduledExecutorService

documentazione DW dice:

"Va notato che l'ambiente è dotato di metodi di fabbrica per istanze ExecutorService e ScheduledExecutorService che sono gestito Vedi LifecycleEnvironment # ExecutorService e LifecycleEnvironment # scheduledExecutorService per i dettagli.. "

Qualcuno sa come implementarlo in DW? Cercando di giocare con le possibilità codice DW, ho trovato questo:

String nameFormat = "?What should this string contain?"; 
ScheduledExecutorServiceBuilder sesBuilder = environment.lifecycle().scheduledExecutorService(nameFormat); 
ScheduledExecutorService ses = sesBuilder.build(); 
Runnable alarmTask = new AlarmTask(); 
ses.scheduleWithFixedDelay(alarmTask, 0, 5, TimeUnit.SECONDS); 

E 'questo il modo corretto di DW per fare questo? BTW un manichino eseguibile:

private static final class AlarmTask implements Runnable { 
     DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
     Calendar cal = Calendar.getInstance(); 
     @Override public void run() { 
      ++fCount; 

      cal = Calendar.getInstance(); 
      System.out.println(fCount + "x BEEP:" + dateFormat.format(cal.getTime())); 
     } 
     private int fCount; 
     } 

Che cosa è lo scopo del nome iniziale e viene usato da qualche parte? Spero che qualcuno possa aiutarti.

risposta

7

Sto facendo praticamente la stessa cosa in un'applicazione Dropwizard per eseguire un lavoro periodicamente. Ci sono progetti come il dropwizard-jobs e il dropwizard-al quarzo, ma questo sembra funzionare bene per le mie semplici esigenze.

ScheduledExecutorServiceBuilder passa il nomeFormat a ThreadFactoryBuilder come modello per denominare i thread. La documentazione per che potrebbe essere utile a voi: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/util/concurrent/ThreadFactoryBuilder.html#setNameFormat(java.lang.String)

1

Con dropwizard-sundial, si possono facilmente integrare la libreria leggera multi-threaded Java processo di pianificazione, Sundial, e aggiungere Jobs sia utilizzando un SimpleTrigger o un CronTrigger. Nel tuo caso, ci si inizia con una classe che definisce la logica di lavoro con un SimpleTrigger della nota:

@SimpleTrigger(repeatInterval = 60, timeUnit = TimeUnit.SECONDS)  
public class SampleJob extends com.xeiam.sundial.Job { 

    @Override 
    public void doRun() throws JobInterruptException { 
    // Do something interesting... 
    } 
} 

Nel file del app Dropwizard yaml, è necessario definire quale pacchetto dropwizard-sundial dovrebbe ricerca delle classi di lavoro annotate . Di seguito è riportato un esempio di configurazione con il parametro annotated-jobs-package-name configurazione insieme a diversi altri params opzionali per la messa a punto lo scheduler:

sundial: 
    thread-pool-size: 10 
    shutdown-on-unload: true 
    wait-on-shutdown: false 
    start-delay-seconds: 0 
    start-scheduler-on-load: true 
    global-lock-on-load: false 
    annotated-jobs-package-name: com.foo.bar.jobs 

Inoltre, è possibile controllare lo scheduler asincrono tramite Curl mentre l'applicazione è in esecuzione di fare cose come il blocco e sbloccare lo scheduler, avviare, arrestare, aggiungere, rimuovere processi e trigger. Ecco alcuni esempi:

curl -X POST http://localhost:9090/admin/tasks/locksundialscheduler 
curl -X POST http://localhost:9090/admin/tasks/unlocksundialscheduler 
curl -X POST "http://localhost:9090/admin/tasks/startjob?JOB_NAME=MyJob" 
Problemi correlati