【问题标题】:Dropwizard ScheduledExecutorServiceDropwizard ScheduledExecutorService
【发布时间】:2014-12-18 23:43:37
【问题描述】:

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

DW 文档说:

"需要注意的是,Environment 内置了工厂方法 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 中执行此操作的正确方法吗?顺便说一句,一个可运行的假人:

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

初始名称的用途是什么,是否在某处使用过?希望有人能帮忙。

【问题讨论】:

    标签: java scheduled-tasks dropwizard


    【解决方案1】:

    我在 Dropwizard 应用程序中做几乎相同的事情来定期运行作业。有诸如 dropwizard-jobs 和 dropwizard-quartz 之类的项目,但这似乎可以很好地满足我的简单需求。

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

    【讨论】:

    【解决方案2】:

    使用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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-22
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 2015-09-11
      • 2018-08-04
      相关资源
      最近更新 更多