...
The normal behaviour is that Job Scheduler handles exit codes <> 0 as an error. In dependence of the error handling, the order go to error state or will be suspended/setbacked. You can change this behaviour by implementing a post processing. In this sample job chain, the post processing is configured as a cdata for the reason of better readability. You can also provide a file with the post processing script to get an general error handling by including the file.
You find Here are two approaches. The first handles each exit code and the second is more generic. You switch between the samples by changing the exit code of the first step. When exit code is 0, the more generic sample will be executed. To see this in your environment, you can download the configuration files and put them into any folder in config/live.
You can download the files from: sample_errorhandling.zip
Code Block |
---|
<job order="yes" stop_on_error="no" title="Just a Sample Job" name="job_sample"> <script language="shell"> <![CDATA[ Echo here is a sample ]]> </script> |
Code Block |
<run_time/> </job> |
The first sample
Code Block |
---|
<job order="yes" stop_on_error="no" name="job_with_exit_code"> <script language="shell"> <![CDATA[ rem this is a shell script ending with an exit code exit 0 ]]> </script> |
Code Block |
<monitor name="exitCodeDispatcher" ordering="0"> <script language="javascript"> <![CDATA[ function spooler_task_after()\{ var exitCode = spooler_task.exit_code; var order = spooler_task.order; spooler_log.info ("Exit Code is: " + exitCode); result = true; switch (exitCode ) \{ case 0: //sample to proceed the job chain at another node spooler_log.info("proceeding with next step"); break; case 1: //sample to proceed the job chain at another node order.state="300" break; case 2: //sample to end with an end state order.state="success:2" break; default: //Other exit codes are handled as an error //spooler_log.info("Exit Code of " + order.job_chain + "/" + order.id + " in node " + order.job_chain_node.state + " was " + exitCode); result = false; break; \} //If you want to avoid messages like //2011-08-04 10:13:14.531 [ERROR] (Task sample/job_with_exit_code:1001447) SCHEDULER-280 Process terminated with exit code 1 (0x1) //spooler_task.exit_code = 0; return result; \} //This also could be done in a more generic way //See sample in Step job_with_exit_code_generic ]]> </script> </monitor> |
Code Block |
<run_time/> </job> |
The second sample
Code Block |
---|
<job order="yes" stop_on_error="no" name="job_with_exit_code_generic"> <params/> |
Code Block |
<script language="shell">
<![CDATA[
rem another sample
exit 98
]]>
</script>
|
Code Block |
<monitor name="exitCodeDispatcherGeneric"
ordering="0">
<script language="javascript">
<![CDATA[
function spooler_task_after()\{
//You define a node with exit.<exitCode> for each possible exitCode
//If node is not defined, a default will be used
var exitCode = spooler_task.exit_code;
var order = spooler_task.order;
|
Code Block |
if (exitCode != 0)\{
newState = "exit." + exitCode;
try \{//Checking, wether node is defined in job chain configuration
order.job_chain.node( newState )
\} catch (e) \{
order.state = "exit.default";
\}
order.state = "exit." + exitCode
\}
return true;
\}
]]>
</script>
</monitor>
|
Code Block |
<run_time/> </job> </jobs> |
Here is the job chain
Code Block |
---|
<job_chain orders_recoverable="yes" visible="yes" title="Sample for a job chain with handling exit codes" name="job_chain_exit_code_dispatcher"> <job_chain_node state="firstStep" job="job_with_exit_code" next_state="secondStep" error_state="error"/> |
Code Block |
<job_chain_node state="secondStep"
job="job_with_exit_code_generic"
next_state="200"
error_state="error"/>
|
Code Block |
<job_chain_node state="200"
error_state="error"
job="job_sample"
next_state="300"/>
|
Code Block |
<job_chain_node state="300"
error_state="error"
job="job_sample"
next_state="400"/>
|
Code Block |
<job_chain_node state="400"
error_state="error"
job="job_sample"
next_state="success"/>
|
Code Block |
<job_chain_node state="success"/>
|
Code Block |
<job_chain_node state="success:2"/>
|
Code Block |
<job_chain_node state="error"/>
|
Code Block |
<job_chain_node state="exit.99"/>
|
Code Block |
<job_chain_node state="exit.default"/>
</job_chain>
|
...