We assume that we have a persistent order which is stored in ./config/live/my/jobChain,template.order.xml.
We want to add an order to the job chain /some/jobChain by a standalone job.
In the following example we use the <show_order ... what="payload"/> command to get the order parameters.
<?xml version="1.0" encoding="ISO-8859-1"?>
<job>
<params>
<param name="orderTemplateFilename" value="/my/jobChain,template.order.xml"/>
<param name="addOrderToJobChain" value="/some/jobChain"/>
</params>
<script language="javascript">
<![CDATA[
function spooler_process() {
//read parameter which has a filename of the template *.order.xml as value
var orderTemplateFilename = spooler_task.params.value('orderTemplateFilename');
//read parameter of a job chain path on which an order will be added
var addOrderToJobChain = spooler_task.params.value('addOrderToJobChain');
var orderTemplateParamsElement = getOrderParamsElement(orderTemplateFilename);
//1.Option: using spooler.execute_xml to add order
var xmlCommand = '<add_order job_chain="'+addOrderToJobChain+'" at="now">'+orderTemplateParamsElement +'</add_order>';
var answer = spooler.execute_xml(xmlCommand);
spooler_log.info("XML Command: " + xmlCommand);
spooler_log.info("Answer: " + answer);
//2.Option: using add_order method on a job chain object
var jobChain = spooler.job_chain( addOrderToJobChain );
var order = spooler.create_order();
order.at = 'now';
order.params.xml = orderTemplateParamsElement||'<params/>';
jobChain.add_order(order);
return false;
}
/**
* @param Filename of an order
* @return String <params> element of JobScheduler answer from <show_order ...> command
*/
function getOrderParamsElement(orderFilename) {
//remove extension of order filename and split, so that job_chain=orderFilenames[0] and orderID=orderFilenames[1]
var orderFilenames = orderFilename.replace( /\.order\.xml$/, "").split(',');
//execute <show_order .../> command with what="payload" to get the parameters
var xmlCommand = '<show_order job_chain="'+orderFilenames[0]+'" order="'+orderFilenames[1]+'" what="payload"/>';
var answer = spooler.execute_xml( xmlCommand );
var paramsElement = "";
//match not empty params element
var paramsElementMatch = answer.match(/<params[^>]*>.+<\/params>/);
if(paramsElementMatch) {
paramsElement = paramsElementMatch[0];
//remove attributes in params element
paramsElement = paramsElement.replace(/(<params)[^>]*(>.+<\/params>)/,"$1$2");
}
spooler_log.info("XML Command: " + xmlCommand);
spooler_log.info("Answer: " + answer);
spooler_log.info("Params Element: " + paramsElement);
return paramsElement;
}
]]>
</script>
<run_time />
</job>
The second option above is better because you can modify the parameters in a simple way:
//2.Option: using add_order method on a job chain object
var jobChain = spooler.job_chain( addOrderToJobChain );
var order = spooler.create_order();
order.at = 'now';
order.params.xml = orderTemplateParamsElement||'<params/>';
order.params.set_var('hello', 'world');
jobChain.add_order(order);
Further References
Job and Order Parameters
- How to set and read job and order parameters
- How to access order parameters and job parameters using the JobScheduler API
- How to pass parameters to subsequent shell jobs in a job chain
- How to dynamically use node parameters and internal parameter substitution