Playframework 将Cron作业手动添加到池中

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

我想做以下工作:

通常,通过实现一个类来实现播放作业,该类扩展了添加到ApplicationStart上的池中的

我现在想在运行时添加Cron作业(通过GUI添加任务…),但我不知道如何实现

我查看了这份工作,发现了以下几行:

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()添加了一个带有未来延迟的单个操作。因此,由于您可以直接访问执行器