scala中长时间间隔的任务调度

Task schedualing over long time intervals in scala

我有一系列任务必须在特定时间点执行(未来很长一段时间,几天甚至几周)。我的计划是为每个线程创建一个等待时间到期的线程。由于任务数量可能非常多,我担心这些线程组合起来会消耗大量资源(无所事事/等待)。我的问题是等待的线程是否消耗资源,如果是,有多少。

(我假设创建一个任务数据库并不断迭代它以查看是否应该执行任何任务效率更低)

这实际上不是特定于 scala 的问题。

让线程长时间等待的问题是您的应用程序可能在此期间崩溃,或者您可能遇到停电或其他情况。

另一方面,将它存储在数据库中对我来说听起来像是一个简单的解决方案。当然,如果您一直遍历所有条目,那将非常耗时。但是,如果数据库中有 "due" 字段,您可以根据该字段进行排序,这应该是相当有效的。显然,您需要选择一个能够有效支持此类操作的适当数据库,但实际上,这将允许您构建一个更可靠的系统,该系统可以在应用程序重新启动后继续正常工作。

如果您需要在特定时间点安排作业,我建议您使用像 http://www.quartz-scheduler.org/ 这样的作业调度程序。 它非常广泛,您可以轻松创建和安排工作,例如:

public class MyJob implements org.quartz.Job {

      public MyJob() {
      }

      public void execute(JobExecutionContext context) throws JobExecutionException {
          System.err.println("Hello World!  MyJob is executing.");
      }
}

  JobDetail job = newJob(MyJob.class)
      .withIdentity("job1", "group1")
      .build();

  // Trigger the job to run now, and then repeat every 40 seconds
  Trigger trigger = newTrigger()
      .withIdentity("trigger1", "group1")
      .startNow()
      .withSchedule(simpleSchedule()
              .withIntervalInSeconds(40)
              .repeatForever())
      .build();

  // Tell quartz to schedule the job using our trigger
  scheduler.scheduleJob(job, trigger);

因为它是一个 Java 库,您当然也可以在 Scala 中轻松使用它(参见 )。

关于使用 Akka 的选项 (@Pavel)。如果您无论如何都不使用 Akka 并且只需要调度程序功能,那么我会选择 Quartz。如果您正在使用 Akka(或计划使用它)并且您只需要 运行 X 周/天/小时后或在特定时期内的作业,则可以使用 Akka 调度程序。如果你需要更复杂的语义,比如特定的日期和时间,我会看看 Quartz。