3

このスレッドは、スケジュールされたタスクの次の実行時間を見つけるのに役立ちました。

スケジュールされたタスクの次回の実行時間を確認するにはどうすればよいですか?

しかし、実行予定の次のスケジュールされたタスクを簡単に取得する方法はありますか?

次に実行する予定のタスクの日付と名前を取得できれば、その日付を jQuery カウントダウン タイマーにプラグインできます。これにより、次にスケジュールされたタスクまでのカウントダウンが次のように表示されます。

TaskABC due to run in:
12    03     20
hrs   min    sec

. これは、人々がどのようにオタクになることができるのか疑問に思っている場合の管理インターフェイス用です:-)

編集

ここに画像の説明を入力

4

2 に答える 2

3

私もビルと同じ考えでした。しかし、別の方法があるかどうか興味がありました。

調べてみると、どうやら内部Schedulerクラスが今後のタスクのリストを保持しているようです。リストは非公開ですが、同じリフレクション手法を使用してアクセスできます。興味深いことに、このリストには、メール スプーラー、セッション/アプリケーション トラッカー、ウォッチャーなどのシステム タスクも含まれています。したがって、「スケジュールされたタスク」が見つかるまで反復する必要があります。CronTabEntry

以下は、CF9 でトリックを行うと思われる非常に軽くテストされた関数です。(注: http://www.cflib.orgのCreateTimeStruct関数が含まれています)。

ルール:

  • 名前と次のタスクまでの残り時間を含む構造体を返します。タスクが見つからなかった場合result.taskは、空の文字列です。
  • 一時停止中のタスクを除外

使用法:

result = new TaskUtil().getNextTask();
WriteDump(result);

フロン

component {
     public struct function getNextTask() {
        // get list of upcoming tasks from factory (UNDOCUMENTED)
        local.scheduler = createObject("java", "coldfusion.server.ServiceFactory").getSchedulerService();
        local.taskField = local.scheduler.getClass().getDeclaredField("_tasks");
        local.taskField.setAccessible( true );
        local.taskList = local.taskField.get(local.scheduler);

        // taskList contains system jobs too, so we must iterate 
        // through the tasks to find the next "scheduled task"
        local.nextTask = "";
        local.tasks = local.taskList.iterator();

        while ( local.tasks.hasNext() ) {
            local.currTask = local.tasks.next();
            local.className = local.currTask.getRunnable().getClass().name;

            // exit as soon as we find a scheduled task that is NOT paused
            if (local.className eq "coldfusion.scheduling.CronTabEntry"
                    && !local.currTask.getRunnable().paused) {
                local.nextTask = local.currTask;
                break;
            }
        }

        // if we found a task, calculate how many days, hours, etcetera  
        // until its next run time
        local.details = { task="", remaining={} };

        if ( isObject(local.nextTask) ) {
            local.secondsToGo  = (local.nextTask.getWhen() - now().getTime()) / 1000;
            local.details.task = local.nextTask.getRunnable().task;
            local.details.remaining = createTimeStruct(local.secondsToGo);
            local.details.nextDate = dateAdd("s", local.nextTask.getWhen() / 1000
                                               , "January 1 1970 00:00:00"  );
        }
        return local.details;   
     }

    /**
     * Abbreviated version of CreateTimeStruct by Dave Pomerance 
     * See http://www.cflib.org/index.cfm?event=page.udfbyid&udfid=421
     *   
     * @param timespan   The timespan to convert. 
     * @return Returns a structure. 
     * @author Dave Pomerance  
     * @version 1, January 7, 2002 
     */
    public struct function CreateTimeStruct(required numeric timespan) {
        var timestruct = StructNew();
        var mask = "s";

        // only 4 allowed values for mask - if not one of those, return blank struct
        if (ListFind("d,h,m,s", mask)) {
            // compute seconds
            if (mask eq "s") {
                timestruct.s = (timespan mod 60) + (timespan - Int(timespan));
                timespan = int(timespan/60);
                mask = "m";
            } else timestruct.s = 0;
            // compute minutes
            if (mask eq "m") {
                timestruct.m = timespan mod 60;
                timespan = int(timespan/60);
                mask = "h";
            } else timestruct.m = 0;
            // compute hours, days
            if (mask eq "h") {
                timestruct.h = timespan mod 24;
                timestruct.d = int(timespan/24);
            } else {
                timestruct.h = 0;
                timestruct.d = timespan;
            }
        }

        return timestruct;
    }

}
于 2012-09-13T10:26:24.547 に答える
2

getNextRunTime(string taskName)私の最初の考えは、タスクのコレクションに対してリーの機能を繰り返すことです。を使用して、スケジュールされたすべてのタスクの詳細を含む構造体の配列を取得できます。taskArray = createobject("java","coldfusion.server.ServiceFactory").getCronService().listAll();

タスク名を含む構造体のキーは「task」です。したがって、たとえば、すべてのタスク名を配列として抽出し、各要素でLeighの関数を実行して、次に実行するタスクを決定できます。

于 2012-09-13T06:14:02.713 に答える