We're trying to build a dashboard for our cron jobs ---- CF, Java, SQLServer, etc. so that we can see when things were run last, what the result was, and when they're scheduled to run next.
Is there a way with the CFAdmin API or some undocumented <cfschedule>
trick to get a list of:
- What tasks are scheduled?
- What the last run time was?
- Did it succeed?
- When is it scheduled to run again?
We're currently on CF8, but will be upgrading to CF9 within a few weeks.
I did a little research into this for you. I found a somewhat older reference that is still valid, at least in CF8 and presumably in CF9 as well.
<cfobject type="JAVA" action="Create" name="factory" class="coldfusion.server.ServiceFactory">
<cfset allTasks = factory.CronService.listAll()/>
<cfloop index="i" from="1" to="#ArrayLen(allTasks)#">
<cfdump var="#allTasks[i]#" />
</cfloop>
From http://www.bpurcell.org/blog/index.cfm?mode=entry&ENTRY=935
This answers your questions #1 and #4.
As for #3, there can be no answer to that. ColdFusion's scheduled task engine is just loading up the specified URL at the prescribed time. There is no success or fail -- it simply performs an HTTP request.
Hope this helps.
It is possible to "Publish" the results of the job. The response from the HTTP request can be written to the file server, and that will have the values of the last run job.
<cfschedule action = "update"
task = "TaskName"
operation = "HTTPRequest"
url = "/index.cfm?action=task"
startDate = "#STARTDATE#"
startTime = "12:00:00 AM"
interval = "Daily"
resolveURL = "NO"
requestTimeOut = "600"
publish = "yes"
path = "#PATH#"
file = "log_file.log">
Then you can verify the log against the database if you wanted. Since it is the response from the page, you can get and store errors and warnings here as well.
@eric kolb is right - that is the way to do it programmatically. If you want more control over how the list reacts, try the following code (essentially the same, but in cfscript):
<cfscript>
scheduledTasksArray=ArrayNew(1);
taskService=createobject('java','coldfusion.server.ServiceFactory').getCronService();
scheduledTasksArray=taskservice.listall();
Also, to answer #2 and #3 (which is pretty much just one two-part question if you do it right):
When the task is run, send yourself an email right at the top saying "HEY! I'M RUNNING!!!!" and then another saying "HEY! I'M DONE!!!" at the bottom of the code for the task - you could add in a timestamp as well to tell when it started and stopped (logging this in a database works too). Also, to know when it will run next, just take a look at the last time AND the "interval" field gotten back from the results of the ServiceFactory call. (If you need further explanation on what I mean by this, feel free to ask.
Hope this helps if you haven't figured out what you needed to already