Dropwizard ScheduledExecutorService

2022-09-04 03:51:51

在我的情况下,我需要运行一些计划任务(例如每分钟)在数据库中进行一些检查,如果需要,还需要一些子任务。这应该不是数据库运行状况检查!

DW 文档说:

“应该注意的是,环境具有用于托管的执行器服务和SchependedExecutorService实例的内置工厂方法。有关详细信息,请参阅 Lifecycle Environment#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中执行此操作的正确方法吗?顺便说一句,一个可运行的假人:

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

初始名称的目的是什么,它是否在某个地方使用?希望有人能帮忙。


答案 1

我在Dropwizard应用程序中做了几乎相同的事情来定期运行作业。有一些项目,如dropwizard-jobs和dropwizard-quartz,但这似乎对我的简单需求很好。

将 传递给 作为命名线程的模式。这方面的文档可能对你有帮助:https://guava.dev/releases/snapshot/api/docs/com/google/common/util/concurrent/ThreadFactoryBuilder.html#setNameFormat(java.lang.String)ScheduledExecutorServiceBuildernameFormatThreadFactoryBuilder


答案 2

借助 dropwizard-sundial,您可以轻松集成轻量级多线程 Java 作业调度库日晷,并使用 .在你的例子中,你从一个类开始,用一个注释定义你的作业逻辑:SimpleTriggerCronTriggerSimpleTrigger

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

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

在 Dropwizard 应用的文件中,您需要定义应使用哪个包来搜索带注释的作业类。下面是一个配置示例,其中包含配置参数以及其他几个用于微调调度程序的可选参数:yamldropwizard-sundialannotated-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"

推荐