// Verify the application.ADFscheduler structure exists if ( !StructKeyExists(application,"ADFscheduler") ) application.ADFscheduler = StructNew(); // Verify the schedule structure exists if ( !StructKeyExists(application,"ADFscheduler") ) application.ADFscheduler = StructNew(); return application.ADFscheduler; var defaultScheduleParams = StructNew();//Default Values var key = ""; defaultScheduleParams.delay = 5; //minutes till next schedule item defaultScheduleParams.tasksPerBatch = 1; //how many tasks to do per iteration defaultScheduleParams.scheduleStart = 1; //Where in the command list to start processing defaultScheduleParams.scheduleStop = ArrayLen(commands); //When to stop processing (say stop at position 11) defaultScheduleParams.makeSchedLogNamesUnique = false; //Override defaults with passed in values if( !StructIsEmpty(arguments.scheduleParams) ) { for(key in arguments.scheduleParams){ if(StructKeyExists(defaultScheduleParams,key)) { defaultScheduleParams[key] = arguments.scheduleParams[key]; } else { //Invalid parameters passed in... throw error in the future? } } } // Verify the schedule structure exists if( !StructKeyExists(application,"ADFscheduler") ) application.ADFscheduler = StructNew(); //Verify the schedule exists, if it does wipe it out if( !StructKeyExists(application.ADFscheduler,arguments.scheduleName) ) { StructInsert(application.ADFscheduler,arguments.scheduleName,StructNew() ); } else { application.ADFscheduler[arguments.scheduleName] = StructNew(); } //Set schedule application.ADFscheduler[arguments.scheduleName].commands = arguments.commands; application.ADFscheduler[arguments.scheduleName].scheduleParams = defaultScheduleParams; application.ADFscheduler[arguments.scheduleName].status = "active"; application.ADFscheduler[arguments.scheduleName].scheduleProgress = defaultScheduleParams.scheduleStart; // Check if want to start the procecing now or set the schedule if ( arguments.startProcessNow ) { //BEGIN! processNextScheduleItem(arguments.scheduleName); } else { setSchedule(arguments.scheduleName); } var schedProtocol = "http"; var cfcatchDump = ''; var currentSchedule = ""; var errorScheduleItem = ""; var scheduleURL = ""; var currentCommand = ""; var siteName = request.site.name; var logFilePrefix = dateFormat(now(), "yyyymmdd") & "." & siteName & "."; var schedLogFileName = logFilePrefix & "scheduledStatus-" & arguments.scheduleName & ".log"; var CSRF_Token = application.ADF.csSecurity.getCSRF_Token(); // Verify the schedule structure exists if ( !StructKeyExists(application,"ADFscheduler") ) application.ADFscheduler = StructNew(); if ( request.CGIVars.https is "on" ) schedProtocol = "https"; //Log the scheduled process start variables.utils.logAppend("Scheduled process started '#arguments.scheduleName#' Progress: #currentSchedule.scheduleProgress#/#ArrayLen(currentSchedule.commands)#","scheduledProcess-#arguments.scheduleName#.txt"); if(isStruct(currentCommand) and StructKeyExists(currentCommand,"bean") and StructKeyExists(currentCommand,"method")) { if(!StructKeyExists(currentCommand,"args")) { currentCommand.args = ""; } if ( StructKeyExists(currentCommand,"app") ) variables.utils.runCommand(beanName=currentCommand.bean,methodName=currentCommand.method,args=currentCommand.args,appName=currentCommand.app); else variables.utils.runCommand(beanName=currentCommand.bean,methodName=currentCommand.method,args=currentCommand.args); } else { errorScheduleItem = variables.utils.doDump(currentCommand,"Failed Schedule Item","false",true); variables.utils.logAppend("Scheduled process error '#arguments.scheduleName#'. Schedule item missing struct key 'bean' or 'method' while processing Schedule Item:
'#errorScheduleItem#'

","scheduledProcess-#arguments.scheduleName#.html"); }
errorScheduleItem = variables.utils.doDump(currentSchedule.commands[currentSchedule.scheduleProgress],"Failed Schedule Item","false",true); variables.utils.logAppend("Scheduled process error '#arguments.scheduleName#' while processing Schedule Item:
'#errorScheduleItem#'

","scheduledProcess-#arguments.scheduleName#.html"); application.ADFscheduler[arguments.scheduleName].status = "failure"; variables.utils.logAppend("#cfcatchDump#","scheduledProcessFailure-#arguments.scheduleName#.html"); return false;
//Horray! The scheduled process finished. Log it, increment the progress. variables.utils.logAppend("Scheduled process complete. '#arguments.scheduleName#' Progress: #currentSchedule.scheduleProgress#/#ArrayLen(currentSchedule.commands)#","scheduledProcess-#arguments.scheduleName#.txt"); currentSchedule.scheduleProgress = currentSchedule.scheduleProgress + 1; if(currentSchedule.scheduleProgress gt ArrayLen(currentSchedule.commands)) { variables.utils.logAppend("Scheduled complete '#arguments.scheduleName#'","scheduledProcess-#arguments.scheduleName#.txt"); currentSchedule.status = "complete"; // Delete CF Scheduled Task to Clean up when the Process has completed variables.utils.deleteScheduledTask(taskName=arguments.scheduleName); variables.utils.logAppend("CF Scheduled Task '#arguments.scheduleName#' has been removed!","scheduledProcess-#arguments.scheduleName#.txt"); return true; } //If this is a batch process do batchyness. if( currentSchedule.scheduleParams.tasksPerBatch gt 1 and currentSchedule.scheduleProgress mod currentSchedule.scheduleParams.tasksPerBatch - 1 neq 0 ) { processNextScheduleItem(arguments.scheduleName); } else { scheduleURL = schedProtocol & ":" & "//#request.CGIVars.server_name#:#request.CGIVars.server_port##application.ADF.ajaxProxy#?bean=scheduler_1_0&method=processNextScheduleItem&scheduleName=#arguments.scheduleName#&CSRF_Token=#CSRF_Token#"; //Schedule the next task variables.utils.setScheduledTask(url=scheduleURL,taskName=arguments.scheduleName,schedLogFileName=schedLogFileName,minuteDelay=currentSchedule.scheduleParams.delay,makeLogFileNameUnique=currentSchedule.scheduleParams.makeSchedLogNamesUnique); //"ScheduledTaskError-#arguments.scheduleName#.html" } if(currentSchedule.scheduleProgress gt currentSchedule.scheduleParams.scheduleStop) { variables.utils.logAppend("Scheduled complete '#arguments.scheduleName#' stopping at position: #currentSchedule.scheduleProgress-1#/#ArrayLen(currentSchedule.commands)#","scheduledProcess-#arguments.scheduleName#.txt"); currentSchedule.status = "complete"; return true; }
var rtnStruct = StructNew(); var currentSchedule = StructNew(); //Set Defaults rtnStruct.currentTask = -1; rtnStruct.totalTasks = -1; rtnStruct.status = "nonexistant"; // Verify the scheduler structure exists if( !StructKeyExists(application,"ADFscheduler") ) application.ADFscheduler = StructNew(); //if there is an existing schedule get its current status information and return it! if ( StructKeyExists(application.ADFscheduler,arguments.scheduleName) ) { currentSchedule = application.ADFscheduler[arguments.scheduleName]; rtnStruct.currentTask = currentSchedule.scheduleProgress-1; rtnStruct.totalTasks = ArrayLen(currentSchedule.commands); rtnStruct.status = currentSchedule.status; rtnStruct.scheduleParams = currentSchedule.scheduleParams; } return rtnStruct; // Verify the schedule structure exists if ( !StructKeyExists(application,"ADFscheduler") ) application.ADFscheduler = StructNew(); if ( StructKeyExists(application.ADFscheduler,arguments.scheduleName) and application.ADFscheduler[arguments.scheduleName].status == "active" ) { application.ADFscheduler[arguments.scheduleName].status = "paused"; return true; } return false; // Verify the schedule structure exists if ( !StructKeyExists(application,"ADFscheduler") ) application.ADFscheduler = StructNew(); //If the schedule exists, is paused and has remaining arguments resume it. if ( StructKeyExists(application.ADFscheduler,arguments.scheduleName) and application.ADFscheduler[arguments.scheduleName].status == "paused" and ArrayLen(application.ADFscheduler[arguments.scheduleName].commands) GTE application.ADFscheduler[arguments.scheduleName].scheduleProgress ) { application.ADFscheduler[arguments.scheduleName].status = "active"; processNextScheduleItem(arguments.scheduleName); return true; } return false; var currentSchedule = ''; var scheduleID = ''; var rtnHTML = ''; var scheduleSuffix = ''; var taskDelay = ''; var taskPerBatch = ''; var totalTasks = 0; var totalBatches = 1; var progressBarInitialVal = 0; var schedFooterJS = ''; var CSRF_Token = application.ADF.csSecurity.getCSRF_Token(); arguments.scheduleName = TRIM(arguments.scheduleName); // Verify the schedule structure exists if ( !StructKeyExists(application,"ADFscheduler") ) application.ADFscheduler = StructNew(); currentSchedule = application.ADFscheduler[arguments.scheduleName]; scheduleSuffix = TRIM(ReReplace(scheduleName, '[^\w]','','all')); scheduleID = "scheduler_" & UCASE(scheduleSuffix); if ( StructKeyExists(currentSchedule,"commands") AND IsArray(currentSchedule.commands) ) totalTasks = ArrayLen(currentSchedule.commands); if ( StructKeyExists(currentSchedule,"SCHEDULEPARAMS") ) { if ( StructKeyExists(currentSchedule.SCHEDULEPARAMS,"Delay") AND IsNumeric(currentSchedule.ScheduleParams.Delay) ) taskDelay = currentSchedule.ScheduleParams.Delay; if ( StructKeyExists(currentSchedule.SCHEDULEPARAMS,"TASKSPERBATCH") AND IsNumeric(currentSchedule.ScheduleParams.TASKSPERBATCH) ) taskPerBatch = currentSchedule.ScheduleParams.TASKSPERBATCH; } if ( IsNumeric(totalTasks) AND IsNumeric(taskPerBatch) AND totalTasks GT 0 AND taskPerBatch GT 0 AND totalTasks GTE taskPerBatch ) totalBatches = INT(Ceiling(totalTasks / taskPerBatch)); progressBarInitialVal = 0; if ( totalTasks GT 0 AND IsNumeric(currentSchedule.scheduleProgress) AND currentSchedule.scheduleProgress GT 0 ) progressBarInitialVal = (currentSchedule.scheduleProgress/totalTasks * 100); variables.scripts.loadJQuery(); variables.scripts.loadJQueryUI(); variables.scripts.addFooterJS(schedFooterJS,"TERTIARY"); Schedule does not exist.
#currentSchedule.status#
Tasks Per Batch: #taskPerBatch#
Minutes Between Batches: #taskDelay#
Total Batches: #totalBatches#
var result = ArrayNew(1); var newResultA = ArrayNew(1); var newResultB = ArrayNew(1); var taskService = ""; var taskQuery = QueryNew("temp"); var i = 1; var taskName = ""; var cfmlEngineType = server.coldfusion.productname; var isCS10Plus = (Val(ListLast(ListFirst(Request.CP.ProductVersion, "."), " ")) >= 10); var cfmlEngineMajorVer = ListFirst(SERVER.ColdFusion.ProductVersion,","); var a = 1; var key = ''; var keyVal = ""; var logError = false; var schedArgs = StructNew(); cfmlEngineMajorVer = 4; if ( StructKeyExists(server,"lucee") AND StructKeyExists(server.lucee,"version") ) cfmlEngineMajorVer = ListFirst(server.lucee.version,"."); // Railo and Lucee CFSchedule List code // Use an attributeCollection for the cfschedule tag so Adobe ColdFusion will not throw an error on the non-ACF attribute "returnvariable" schedArgs.action = "list"; if ( cfmlEngineMajorVer GTE 5 ) { // Lucee 5.x and above use a result attribute to return back the query results schedArgs.result = "taskQuery"; } else { // Railo/Lucee 4.x and below use a returnvariable attribute to return back the query results schedArgs.returnvariable = "taskQuery"; } // Convert the Scheduled task query from Railo/Lucee/CF10+ to a Array of Structs result = variables.data.queryToArrayOfStructures(queryData=taskQuery,keysToLowercase=true); // For backward compatiblity convert newer key names to older 'taskService' style keys names for ( a=1; a LTE ArrayLen(result); a=a+1 ) { for (key in result[a]) { keyVal = result[a][key]; if ( key EQ "startdate" ) newResultA[a]["start_date"] = keyVal; else if ( key EQ "starttime" ) newResultA[a]["start_time"] = keyVal; else if ( key EQ "enddate" ) newResultA[a]["end_date"] = keyVal; else if ( key EQ "endtime" ) newResultA[a]["end_time"] = keyVal; else if ( key EQ "port" ) newResultA[a]["http_port"] = keyVal; else if ( key EQ "proxyport" ) newResultA[a]["http_proxy_port"] = keyVal; else if ( key EQ "timeout" ) newResultA[a]["request_time_out"] = keyVal; else newResultA[a][key] = keyVal; } } result = newResultA; // For forward compatiblity convert older 'taskService' style keys to newer key names for ( a=1; a LTE ArrayLen(result); a=a+1 ) { for (key in result[a]) { keyVal = result[a][key]; if ( key EQ "start_date" ) newResultA[a]["startdate"] = keyVal; else if ( key EQ "start_time" ) newResultA[a]["starttime"] = keyVal; else if ( key EQ "end_date" ) newResultA[a]["enddate"] = keyVal; else if ( key EQ "end_time" ) newResultA[a]["endtime"] = keyVal; else if ( key EQ "http_port" ) newResultA[a]["port"] = keyVal; else if ( key EQ "http_proxy_port" ) newResultA[a]["proxyport"] = keyVal; else if ( key EQ "request_time_out" ) newResultA[a]["timeout"] = keyVal; else newResultA[a][key] = keyVal; } } result = newResultA; if ( ArrayLen(result) ) { // If filter value is passed in loop over the Array of task and build a new array if ( LEN(TRIM(arguments.taskNameFilter)) ) { for ( i; i LTE ArrayLen(result); i=i+1 ) { taskName = result[i].task; // Only Add Tasks to the Result Array if they contain the filter value if ( FindNoCase(arguments.taskNameFilter,taskName,1) NEQ 0 ) { arrayAppend(newResultB,result[i]); } } result = newResultB; } } return result; var CSRF_Token = application.ADF.csSecurity.getCSRF_Token(); var schedProtocol = "http"; var scheduleURL = "//#request.CGIVars.server_name#:#request.CGIVars.server_port##application.ADF.ajaxProxy#?bean=scheduler_1_0&method=processNextScheduleItem&scheduleName=#arguments.scheduleName#&CSRF_Token=#CSRF_Token#"; var logFilePrefix = dateFormat(now(), "yyyymmdd") & "." & request.site.name & "."; var schedLogFileName = logFilePrefix & "scheduledStatus-" & arguments.scheduleName & ".log"; var currentSchedule = ""; if ( request.CGIVars.https is "on" ) schedProtocol = "https"; scheduleURL = schedProtocol & ":" & scheduleURL; // Verify the schedule structure exists if ( !StructKeyExists(application,"ADFscheduler") ) application.ADFscheduler = StructNew(); try { // Check if the schedule exists if ( StructKeyExists(application.ADFscheduler,arguments.scheduleName) ) { currentSchedule = application.ADFscheduler[arguments.scheduleName]; } // Schedule the task within CF variables.utils.setScheduledTask(url=scheduleURL,taskName=aarguments.scheduleName,schedLogFileName=schedLogFileName,minuteDelay=currentSchedule.scheduleParams.delay,makeLogFileNameUnique=currentSchedule.scheduleParams.makeSchedLogNamesUnique); //"ScheduledTaskError-#arguments.scheduleName#.html" return true; } catch ( any ex ) { //variables.utils.dodump(ex,"ex", true); return false; } // Verify the schedule structure exists if ( !StructKeyExists(application,"ADFscheduler") ) application.ADFscheduler = StructNew(); try { StructDelete(application.ADFscheduler, arguments.scheduleName, false); return true; } catch ( any ex ) { //variables.utils.dodump(ex,"ex", true); return false; }