我想做以下事情:
通常你通过实现一个扩展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()
答案 0 :(得分:0)
查看JobsPlugin的源代码,您应该能够模仿使用scheduledJobs
和executor
属性完成的操作。
如果您查看onApplicationStart
方法,则会显示使用@On
或'@Every are managed in the job pool.
On uses the CRON expression and uses
scheduleForCRON , where as
每个人注释作业的方式`使用执行器来管理重复。
由于scheduledJobs
和executor
属性是公共静态的,您可以根据需要访问和操作它,因此我建议您阅读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());
}
}