Dropwizard ScheduledExecutorService

时间:2014-10-23 10:11:52

标签: java scheduled-tasks dropwizard

在我的情况下,我需要运行一些计划任务(例如每分钟)在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;
      }

什么是初始名称的目的,是否在某处使用?希望有人可以提供帮助。

2 个答案:

答案 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,并使用SimpleTriggerCronTrigger添加作业。在您的情况下,您将从一个使用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"