2

我想做以下事情:

通常,您通过实现一个类来实现 Play-Jobs,该类扩展了 添加到池OnApplicationStart ...

我现在想在运行时添加 Cron-Jobs(通过 GUI 添加任务...),但我不确定如何实现。

我查看了 JobsPlugin 并发现以下几行:

job.nextPlannedExecution = nextDate;
executor.schedule((Callable<V>)job, nextDate.getTime() - now.getTime(), TimeUnit.MILLISECONDS);
job.executor = executor;

我必须像那样添加它们吗?

这甚至可能吗?因为我找不到任何行,告诉作业本身,它应该遵循哪个 Cron-Expression...

String cron = job.getClass().getAnnotation(On.class).value();

job.nextPlannedExecution在 Job-Execution 和新设置之后,这条线是否再次从外部调用?


好的,我希望我现在不回答我自己的问题,但这可能是解决方案吗?:

我实现了自己的 Job-Class,添加了一个属性,例如cronExpression并覆盖了 Job 的

public void _finally() {
    super._finally();
    if (executor == JobsPlugin.executor) {
        JobsPlugin.scheduleForCRON(this);
    }
}

实现我自己的sheduleForCron()

4

1 回答 1

0

查看 JobsPlugin 的源代码,您应该能够模仿使用scheduledJobsandexecutor属性所做的事情。

如果你看一下这个onApplicationStart方法,这显示了用@On'@Every are managed in the job pool.On uses the CRON expression and usesscheduleForCRON , where asEvery` 注释的 Jobs 如何使用执行器来管理重复。

由于scheduledJobsexecutor属性是公共静态的,你可以随心所欲地访问和操作它,所以我建议通读 JobsPlugin 的源代码,尤其是下面的代码,并在你自己的代码库中模仿它。

        // @On
        if (clazz.isAnnotationPresent(On.class)) {
            try {
                Job<?> job = ((Job<?>) clazz.newInstance());
                scheduledJobs.add(job);
                scheduleForCRON(job);
            } catch (InstantiationException ex) {
                throw new UnexpectedException("Cannot instanciate Job " + clazz.getName());
            } catch (IllegalAccessException ex) {
                throw new UnexpectedException("Cannot instanciate Job " + clazz.getName());
            }
        }
        // @Every
        if (clazz.isAnnotationPresent(Every.class)) {
            try {
                Job job = (Job) clazz.newInstance();
                scheduledJobs.add(job);
                String value = job.getClass().getAnnotation(Every.class).value();
                if (value.startsWith("cron.")) {
                    value = Play.configuration.getProperty(value);
                }
                value = Expression.evaluate(value, value).toString();
                if(!"never".equalsIgnoreCase(value)){
                    executor.scheduleWithFixedDelay(job, Time.parseDuration(value), Time.parseDuration(value), TimeUnit.SECONDS);
                }
            } catch (InstantiationException ex) {
                throw new UnexpectedException("Cannot instanciate Job " + clazz.getName());
            } catch (IllegalAccessException ex) {
                throw new UnexpectedException("Cannot instanciate Job " + clazz.getName());
            }
        }
于 2012-08-08T08:42:55.820 回答