Playframework 将Cron作业手动添加到池中
我想做以下工作: 通常,通过实现一个类来实现播放作业,该类扩展了添加到ApplicationStart上的池中的 我现在想在运行时添加Cron作业(通过GUI添加任务…),但我不知道如何实现 我查看了这份工作,发现了以下几行:Playframework 将Cron作业手动添加到池中,playframework,playframework-1.x,Playframework,Playframework 1.x,我想做以下工作: 通常,通过实现一个类来实现播放作业,该类扩展了添加到ApplicationStart上的池中的 我现在想在运行时添加Cron作业(通过GUI添加任务…),但我不知道如何实现 我查看了这份工作,发现了以下几行: job.nextPlannedExecution = nextDate; executor.schedule((Callable<V>)job, nextDate.getTime() - now.getTime(), TimeUnit.MILLISECONDS
job.nextPlannedExecution = nextDate;
executor.schedule((Callable<V>)job, nextDate.getTime() - now.getTime(), TimeUnit.MILLISECONDS);
job.executor = executor;
在执行作业并设置新的作业后,是否再次从外部调用此行。nextPlannedExecution
好吧,我希望我现在不回答我自己的问题,但这是解决办法吗 我实现自己的作业类,添加一个属性,例如
cronExpression
,并覆盖作业的
public void _finally() {
super._finally();
if (executor == JobsPlugin.executor) {
JobsPlugin.scheduleForCRON(this);
}
}
要实现我自己的
scheduleforcron()
查看jobslugin的源代码,您应该能够模拟使用scheduledJobs
和executor
属性所做的事情
如果查看应用程序启动的方法,这将显示如何在作业池中管理使用@On
或'@Every注释的作业。
On使用CRON表达式并使用
scheduleForCRON,其中as
Every`使用执行器管理重复
由于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());
}
}
/@On
如果(课堂上有注释){
试一试{
作业作业=((作业)clazz.newInstance());
scheduledJobs.add(作业);
scheduleForCRON(作业);
}catch(实例化异常){
抛出新的意外异常(“无法实例化作业”+clazz.getName());
}捕获(非法访问例外){
抛出新的意外异常(“无法实例化作业”+clazz.getName());
}
}
//@每
if(类别isAnnotationPresent(每个类别)){
试一试{
Job Job=(Job)clazz.newInstance();
scheduledJobs.add(作业);
字符串值=job.getClass().getAnnotation(Every.class).value();
if(value.startsWith(“cron”)){
value=Play.configuration.getProperty(值);
}
value=Expression.evaluate(value,value).toString();
如果(!“从不”。相等信号情况(值)){
executor.scheduleWithFixedDelay(作业、时间、解析持续时间(值)、时间、解析持续时间(值)、时间单位。秒);
}
}catch(实例化异常){
抛出新的意外异常(“无法实例化作业”+clazz.getName());
}捕获(非法访问例外){
抛出新的意外异常(“无法实例化作业”+clazz.getName());
}
}
查看JobsPlugin的源代码,您应该能够模拟使用scheduledJobs
和executor
属性所做的操作
如果查看应用程序启动的方法,这将显示如何在作业池中管理使用@On
或'@Every注释的作业。
On使用CRON表达式并使用
scheduleForCRON,其中as
Every`使用执行器管理重复
由于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());
}
}
/@On
如果(课堂上有注释){
试一试{
作业作业=((作业)clazz.newInstance());
scheduledJobs.add(作业);
scheduleForCRON(作业);
}catch(实例化异常){
抛出新的意外异常(“无法实例化作业”+clazz.getName());
}捕获(非法访问例外){
抛出新的意外异常(“无法实例化作业”+clazz.getName());
}
}
//@每
if(类别isAnnotationPresent(每个类别)){
试一试{
Job Job=(Job)clazz.newInstance();
scheduledJobs.add(作业);
字符串值=job.getClass().getAnnotation(Every.class).value();
if(value.startsWith(“cron”)){
value=Play.configuration.getProperty(值);
}
value=Expression.evaluate(value,value).toString();
如果(!“从不”。相等信号情况(值)){
executor.scheduleWithFixedDelay(作业、时间、解析持续时间(值)、时间、解析持续时间(值)、时间单位。秒);
}
}catch(实例化异常){
抛出新的意外异常(“无法实例化作业”+clazz.getName());
}捕获(非法访问例外){
抛出新的意外异常(“无法实例化作业”+clazz.getName());
}
}
我认为ScheduledJobs只是为了调试。。因为它除了在getStatus()方法中打印一些内容外,其他地方都没有使用。。。executoor.sheduleWithFixedDelay()添加了一个定期操作,executoor.shedule()添加了一个具有未来延迟的单个操作。因此,由于您可以直接访问执行器,因此您几乎可以启动任何想要启动的作业。我认为,sheduledJobs只是用于调试目的。。因为它除了在getStatus()方法中打印一些内容外,其他地方都没有使用。。。exectuor.sheduleWithFixedDelay()添加了一个定期操作,exectuor.shedule()添加了一个带有未来延迟的单个操作。因此,由于您可以直接访问执行器