代码之家  ›  专栏  ›  技术社区  ›  user2887596

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

  •  0
  • user2887596  · 技术社区  · 7 年前

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

    (我认为创建任务数据库并不断迭代以查看是否应该执行任何任务的效率更低)

    2 回复  |  直到 7 年前
        1
  •  0
  •   rethab    7 年前

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

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

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

        2
  •  0
  •   thwiegan    7 年前

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

    SO here ).

    关于使用Akka(@Pavel)的选项。如果你不使用Akka,你只需要调度器功能,我会选择Quartz。如果您正在使用Akka(或计划使用它),并且您只需要从现在起或在某个时间段内运行X周/天/小时的作业,那么您可以使用Akka调度程序。如果你需要更复杂的语义,比如具体的日期和时间,我会看看Quartz。