吊索调度方法重构

时间:2015-09-02 12:56:38

标签: java refactoring aem sling

我已弃用方法Scheduler.addPeriodicJob。我想重构我的代码并替换它 Scheduler.schedule如何使用ScheduleOptions接口以及如何通过它传递值?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

如果您有很多修复引用,则应使用此解决方案。

模拟调度程序界面,以便您可以重构其用法

您可以在代码库中创建一个类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类。 你的所有代码都应该已经迁移了!

在提交之前

你终于有一个清理步骤,你 必须 (我不能强调这一点):

  1. 审核所有更改
  2. 测试
  3. 提交
  4. 可能需要额外的清理

    然后你应该删除所有不必要的代码或默认值。

    例如,我的测试样本:

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

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

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