2

私は次のことをしたい:

通常、Play-Jobsを実装する には、プールOnApplicationStart...に追加されるhttp://www.playframework.org/documentation/api/1.2.4/play/jobs/Job.htmlを拡張するクラスを実装します。

実行時に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とnewjob.nextPlannedExecutionが設定された後、この回線は再び外部から呼び出されますか?


わかりました。今は自分の質問に答えないことを願っていますが、これが解決策になる可能性がありますか?:

私は自分のジョブクラスを実装し、たとえば属性を追加してcronExpression、ジョブをオーバーライドします

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

私自身を実装するsheduleForCron()

4

1 に答える 1

0

JobsPluginのソースコードを見ると、scheduledJobsandexecutor属性を使用して行われていることを模倣できるはずです。

メソッドを見るとonApplicationStart、これは、ジョブに注釈が付けられている@Onか、「@EveryOnscheduleForCRONEvery」are managed in the job pool.がエグゼキュータを使用して繰り返しを管理する方法を示してuses the CRON expression and usesいます。, where as

scheduledJobsand属性はexecutorpublicstaticであるため、これにアクセスして操作することができます。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 に答える