在我的情况下,我需要运行一些计划任务(例如每分钟)在DB中执行一些检查,如果需要,还需要一些子任务。这应该是没有DB健康检查!
DW文档说:
“应该注意环境有内置的工厂方法 ExecutorService和ScheduledExecutorService实例 管理。请参阅LifecycleEnvironment#executorService和 LifecycleEnvironment#scheduledExecutorService了解详情。“
有谁知道如何在DW中实现这一点?试着玩DW代码的可能性,我发现了这个:
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);
这是DW中正确的方法吗? BTW一个可运行的假人:
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;
}
什么是初始名称的目的,是否在某处使用?希望有人可以提供帮助。
答案 0 :(得分:9)
我在Dropwizard应用程序中做同样的事情来定期运行作业。有一些项目,如dropwizard-jobs和dropwizard-quartz,但这似乎可以满足我的简单需求。
ScheduledExecutorServiceBuilder将nameFormat传递给ThreadFactoryBuilder,作为命名线程的模式。该文档可能对您有所帮助:http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/util/concurrent/ThreadFactoryBuilder.html#setNameFormat(java.lang.String)
答案 1 :(得分:1)
使用dropwizard-sundial,您可以轻松集成轻量级多线程Java作业调度库Sundial,并使用SimpleTrigger
或CronTrigger
添加作业。在您的情况下,您将从一个使用SimpleTrigger
注释定义作业逻辑的类开始:
@SimpleTrigger(repeatInterval = 60, timeUnit = TimeUnit.SECONDS)
public class SampleJob extends com.xeiam.sundial.Job {
@Override
public void doRun() throws JobInterruptException {
// Do something interesting...
}
}
在Dropwizard应用的yaml
文件中,您需要定义哪个包dropwizard-sundial
应搜索带注释的作业类。以下是带有annotated-jobs-package-name
配置参数的示例配置以及其他几个用于微调调度程序的可选参数:
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
此外,您可以在应用程序运行时通过Curl异步控制调度程序,以执行锁定和解锁调度程序,启动,停止,添加,删除作业和触发器等操作。以下是一些例子:
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"