我正在尝试使用时间间隔
在cq中创建一个cronjob我在链接https://sling.apache.org/documentation/bundles/scheduler-service-commons-scheduler.html上看到我可以让job1运行,它会起作用。但我对代码有疑问。
在下面的代码中
job1.run()
块中调用catch
?我们可以不将它添加到try
块吗?job1.run()
吗?我可以添加try
块还是必须在catch
块中?Thread newThread = new Thread(job1);
newThread.start();
我在上面的链接中看到了cronjob代码
protected void activate(ComponentContext componentContext) throws Exception {
//case 1: with addJob() method: executes the job every minute
String schedulingExpression = "0 * * * * ?";
String jobName1 = "case1";
Map<String, Serializable> config1 = new HashMap<String, Serializable>();
boolean canRunConcurrently = true;
final Runnable job1 = new Runnable() {
public void run() {
log.info("Executing job1");
}
};
try {
this.scheduler.addJob(jobName1, job1, config1, schedulingExpression, canRunConcurrently);
} catch (Exception e) {
job1.run();
}
}
答案 0 :(得分:1)
根据Javadoc,如果无法添加作业,addJob
,addPeriodicJob
和fireJobAt
会抛出Exception
。文档没有提出任何关于此类失败原因的建议。
您在问题中引用的the Apache Sling Scheduler documentation page上的代码段会捕获并忽略这些例外情况。
查看提供的实现,job1
只是一个常规的runnable,因此在run
块中手动执行catch
方法根本不会影响调度程序。
它似乎正在做的是尝试添加作业,如果失败,请静默忽略它并手动运行它以便打印"Executing job1"
这种方法至少存在两个严重问题:
至于为什么会这样?我不知道。它只是愚蠢而且我当然不希望在实际的非教程代码中看到它。
使用这种通用异常来发出信号失败的API也非常不幸。
巧合的是,Sling 7弃用了addJob
,addPeriodicJob
和fireJobAt
,并将其全部替换为schedule
。 schedule
方法返回boolean
,因此它不会提供有关确切发生的更多信息,但不要求您使用丑陋的try
catch
块。< / p>
如果您无法使用最新版本的Sling,请务必使用记录器并记录异常。手动运行你的工作,无论它们是什么,可能都没有多大意义,但这是你需要决定的事情。