AEM cronjob基于一定的时间间隔

时间:2016-02-04 11:40:16

标签: cron cq5 aem sling

我正在尝试使用时间间隔

在cq中创建一个cronjob

我在链接https://sling.apache.org/documentation/bundles/scheduler-service-commons-scheduler.html上看到我可以让job1运行,它会起作用。但我对代码有疑问。

在下面的代码中

  1. 为什么在job1.run()块中调用catch?我们可以不将它添加到try块吗?
  2. 我可以使用start使用线程替换catch块而不是job1.run()吗?我可以添加try块还是必须在catch块中?
  3. 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();
        }
    }
    

1 个答案:

答案 0 :(得分:1)

根据Javadoc,如果无法添加作业,addJobaddPeriodicJobfireJobAt会抛出Exception。文档没有提出任何关于此类失败原因的建议。

您在问题中引用的the Apache Sling Scheduler documentation page上的代码段会捕获并忽略这些例外情况。

查看提供的实现,job1只是一个常规的runnable,因此在run块中手动执行catch方法根本不会影响调度程序。

它似乎正在做的是尝试添加作业,如果失败,请静默忽略它并手动运行它以便打印"Executing job1"

这种方法至少存在两个严重问题:

  1. 代码忽略了这样一个事实,即在添加作业时出现问题并假装从未发生过这种情况(没有记录,没有记录)
  2. 它会手动运行作业,让您觉得它已经安排并且第一次运行。
  3. 至于为什么会这样?我不知道。它只是愚蠢而且我当然不希望在实际的非教程代码中看到它。

    使用这种通用异常来发出信号失败的API也非常不幸。

    巧合的是,Sling 7弃用了addJobaddPeriodicJobfireJobAt,并将其全部替换为scheduleschedule方法返回boolean,因此它不会提供有关确切发生的更多信息,但不要求您使用丑陋的try catch块。< / p>

    如果您无法使用最新版本的Sling,请务必使用记录器并记录异常。手动运行你的工作,无论它们是什么,可能都没有多大意义,但这是你需要决定的事情。