2014-10-23 18 views
11

In meinem Fall muss ich einige geplante Aufgaben ausführen (z. B. jede Minute), einige Überprüfungen in DB und wenn nötig einige Unteraufgaben. Dies sollte kein DB-Health-Check sein!Dropwizard ScheduledExecutorService

DW Dokumentation sagt:

„Es sollte beachtet werden, dass Umwelt Factory-Methoden in Einbau für hat ExecutorService und ScheduledExecutorService Instanzen, die verwaltet werden, finden Sie LifecycleEnvironment # ExecutorService und LifecycleEnvironment # ScheduledExecutorService für weitere Einzelheiten.. "

Kann jemand dies in DW implementieren? Der Versuch, mit DW-Code Möglichkeiten zu spielen, um, fand ich diese:

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); 

Ist dies der richtige Weg in DW dies zu tun? BTW ein lauffähiges Dummy:

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; 
     } 

Was ist der Zweck des ursprünglichen Namens und wird es irgendwo verwendet? Hoffe jemand kann helfen.

Antwort

7

Ich mache so ziemlich das gleiche in einer Dropwizard App, um einen Job in regelmäßigen Abständen auszuführen. Es gibt Projekte wie Dropwizard-Jobs und Dropwizard-Quartz, aber das schien für meine einfachen Bedürfnisse gut zu funktionieren.

Der ScheduledExecutorServiceBuilder übergibt das NameFormat an den ThreadFactoryBuilder als ein Muster für die Benennung der Threads. Die Dokumentation für das auch sein mag für Sie hilfreich: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/util/concurrent/ThreadFactoryBuilder.html#setNameFormat(java.lang.String)

1

Mit dropwizard-sundial, Sie bequem die leichte Multithread-Java Job-Scheduling-Bibliothek integrieren können, Sundial und Jobs hinzufügen entweder mit einem SimpleTrigger oder CronTrigger. In Ihrem Fall würden Sie mit einer Klasse der Definition Ihrer Auftragslogik mit einer SimpleTrigger Annotation beginnen:

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

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

in Ihrer Dropwizard App yaml Datei, werden Sie brauchen, um zu definieren, welches Paket dropwizard-sundial für kommentierten Job-Klassen gesucht werden sollen . Es folgt ein Beispiel Config mit dem annotated-jobs-package-name Config param zusammen mit einigen anderen optionalen params für die Feinabstimmung der 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 

Zusätzlich Sie den Scheduler asynchron über Locken steuern kann, während die App Dinge zu tun, läuft wie Sperren und Entsperren des Schedulers, Starten, Stoppen, Hinzufügen, Entfernen von Jobs und Triggern. Hier sind ein paar Beispiele:

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" 
Verwandte Themen