该线程是在寻找出下一个运行时调度任务非常有用。
如何找出下次运行时间计划的任务?
但是,有没有也是一种方式简单地得到,由于运行下一个计划任务?
如果我能得到应有的下一个任务运行的日期和姓名,我可以插在该日期为jQuery的倒数计时器,它会显示一个倒数至下一次的计划任务,是这样的:
TaskABC due to run in:
12 03 20
hrs min sec
。 这是一个管理界面中如果你想知道人们是如何令人讨厌可以得到:-)
该线程是在寻找出下一个运行时调度任务非常有用。
如何找出下次运行时间计划的任务?
但是,有没有也是一种方式简单地得到,由于运行下一个计划任务?
如果我能得到应有的下一个任务运行的日期和姓名,我可以插在该日期为jQuery的倒数计时器,它会显示一个倒数至下一次的计划任务,是这样的:
TaskABC due to run in:
12 03 20
hrs min sec
。 这是一个管理界面中如果你想知道人们是如何令人讨厌可以得到:-)
我有同样的想法比尔。 但很好奇,如果有另一种方式。
我戳周围,显然内部Scheduler
类维护的即将到来的任务列表。 这份名单是私有的,但你可以使用相同的反射技术来访问它。 有趣的是,名单中还包括系统任务,如邮件后台处理程序,会议/应用程序跟踪,观察,etecetera。 所以,你必须遍历它,直到你找到一个“计划任务”,即CronTabEntry
下面是一个非常轻测试的功能,似乎做CF9的伎俩。 (注意,包括CreateTimeStruct从功能http://www.cflib.org )。
规则:
result.task
是一个空字符串。 用法:
result = new TaskUtil().getNextTask();
WriteDump(result);
CFC
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;
}
}
我首先想到的是迭代Leigh的getNextRunTime(string taskName)
在任务的采集功能。 你可以包含使用所有计划任务的细节结构数组taskArray = createobject("java","coldfusion.server.ServiceFactory").getCronService().listAll();
在包含任务名称的结构的关键是“任务”。 所以,你可以提取所有的任务名称,例如数组,每个元素上运行Leigh的功能,并确定哪一个将在下一个运行。