手动将Cron-Job添加到池中

时间:2012-08-08 07:10:21

标签: playframework playframework-1.x

我想做以下事情:

通常你通过实现一个扩展http://www.playframework.org/documentation/api/1.2.4/play/jobs/Job.html的类来实现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-Excecution之后是否再次从外部调用此行并设置了新的job.nextPlannedExecution


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

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

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

实现我自己的sheduleForCron()

1 个答案:

答案 0 :(得分:0)

查看JobsPlugin的源代码,您应该能够模仿使用scheduledJobsexecutor属性完成的操作。

如果您查看onApplicationStart方法,则会显示使用@On或'@Every are managed in the job pool. On uses the CRON expression and uses scheduleForCRON , where as每个人注释作业的方式`使用执行器来管理重复。

由于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());
            }
        }