Sling 调度程序方法重构

Sling scheduler method refactor

我已弃​​用方法 Scheduler.addPeriodicJob。我想重构我的代码并将其替换为 Scheduler.schedule How to do it with ScheduleOptions接口以及如何通过它传递值?

看看this page。 看起来您需要像这样替换每个调用:

Scheduler s;
s.addPeriodicJob(name, job, config, period, canRunConcurrently);

类似

Scheduler s;
ScheduleOptions so = Scheduler.NOW(times, period); // times == -1 for endless
so.canRunConcurrently(canRunConcurrently);
so.config(config);
so.name(name);
s.schedule(job, so);

如果您有很多参考文献需要修复,则应使用此解决方案。

模拟 Scheduler 接口以便重构其用法

您可以在您的代码库中创建一个 class org.apache.sling.commons.scheduler.Scheduler 并声明新旧方法:

public class Scheduler {

  @Deprecated
  public void addPeriodicJob(String name,
                             Object job,
                             Map<String,Serializable> config,
                             long period,
                             boolean canRunConcurrently)
                  throws Exception {
      ScheduleOptions options = NOW(-1, period)
          .name(name)
          .config(config)
          .canRunConcurrently(canRunConcurrently);
      schedule(job, options);
  }

  public boolean schedule(Object job, ScheduleOptions options) {
      // dummy placeholder to let the code compile
      return false;
  }
}

(您可能需要实现 Scheduler 接口所需的所有方法,以使您的代码编译并让重构按预期工作)

然后,使用 IDE 的重构工具内联 addPeriodicJob() 方法。 最后,删除您在代码库中创建的 Scheduler class。 您现在应该已经迁移了所有代码!

提交之前

你终于有了一个清理步骤,你必须(我怎么强调都不为过):

  1. 查看所有更改
  2. 测试
  3. 提交

可能需要进一步清理

那么您应该删除所有不必要的代码或默认值。

比如我的测试样本:

public static void main(String[] args) {
    Scheduler scheduler = new Scheduler();
    scheduler.addPeriodicJob("name", new Object(), Collections.EMPTY_MAP, 10, false);
}

结果是这样的:

public static void main(String[] args) {
    Scheduler scheduler = new Scheduler();
    ScheduleOptions options = scheduler.NOW(-1, (long) 10).name("name").config((Map<String, Serializable>) Collections.EMPTY_MAP).canRunConcurrently(false);
    scheduler.schedule(new Object(), options);
}

您可以进行一些重新格式化和清理以在此处结束:

public static void main(String[] args) {
    Scheduler scheduler = new Scheduler();
    ScheduleOptions options = scheduler
        .NOW(-1, 10)
        .name("name")
        .config(Collections.EMPTY_MAP)
        .canRunConcurrently(false);
    scheduler.schedule(new Object(), options);
}

如果您删除了设置默认值或无意义值的代码,您甚至可能会得到(我想,因为我对 sling 一无所知):

public static void main(String[] args) {
    Scheduler scheduler = new Scheduler();
    scheduler.schedule(new Object(), scheduler.NOW(-1, 10));
}