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。
您现在应该已经迁移了所有代码!
提交之前
你终于有了一个清理步骤,你必须(我怎么强调都不为过):
- 查看所有更改
- 测试
- 提交
可能需要进一步清理
那么您应该删除所有不必要的代码或默认值。
比如我的测试样本:
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));
}
我已弃用方法 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。
您现在应该已经迁移了所有代码!
提交之前
你终于有了一个清理步骤,你必须(我怎么强调都不为过):
- 查看所有更改
- 测试
- 提交
可能需要进一步清理
那么您应该删除所有不必要的代码或默认值。
比如我的测试样本:
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));
}