Table of Contents | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Info | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||
Control of process flow has been improved by a generic feature
|
- The normal behaviour is that
...
- JobScheduler handles exit codes <> 0 as an error.
...
- Depending on the error handling, the order
...
- moves to the error state
...
- , will be suspended
...
- or will enter a setback interval.
- You can
...
- modify this behaviour by implementing
...
- some post
...
- -processing:
- For the following example job chain
- -processing:
...
- the post-processing is configured as a
...
- CDATA element for
...
- better readability.
- You
...
- could also provide a file with
...
- a post-processing script to
...
- organise some general use of error handling by including the file to multiple job chains.
...
- There are two possible approaches
...
- :
- the first handles each exit code
...
- individually and
- the second is more generic.
- You switch between the
...
- examples by changing the exit code of the first step.
...
- If the exit code is 0, then the more generic
...
- example will be executed.
- To make this example work for your environment you can download the configuration files and add them to a folder in the .
...
- /config/live directory.
First Example
Job: job_with_exit_code
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<job order="yes |
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"> <javax.script:ECMAscript"><![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 example to proceed the job chain at another node spooler_log.info( "proceeding with next step" ); break; case 1: //sample example to proceed the job chain at another node order.set_state=( "300" ); break; case 2: //sample example to end with an end state order.set_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.set_exit_code( =0 0); return result; \ } // This also could be done in a more generic way // See sampleexample in Stepstep job_with_exit_code_generic ]]> <]]></script> </monitor> |
Code Block |
<run_time/> </job> |
The second sample
Second Example
Job: job_with_exit_code_generic
Code Block | ||||
---|---|---|---|---|
| ||||
Code Block | ||||
| ||||
<job order="yes"> <params/> | ||||
Code Block | ||||
<script language="shell">><![CDATA[ <![CDATA[ rem another sampleexample exit 98 exit ]]>98 <]]></script> | ||||
Code Block | ||||
<monitor name="exitCodeDispatcherGeneric" ordering="0"> <script language="javascript"> <javax.script:ECMAscript"><![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, wetherwhether node is defined in job chain configuration order.job_chain().node( newState ) \ } catch (e) \{ order.set_state( = "exit.default" ); \ } order.set_state( = "exit." + exitCode ); \ } return true; \ } ]]> ></script> </script>monitor> </monitor> <run_time/> </job> |
Job and Job Chain for both Examples
Job: job_sample
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<job order="yes" | ||||||
Code Block | ||||||
<run_time/> title="Just an Example Job"> </job> </jobs> |
Here is the job chain
Code Block |
---|
<job_chain orders_recoverable<script language="yesshell"><![CDATA[ echo "here comes an example" ]]></script> visible="yes" <run_time/> </job> |
Job Chain: job_chain_exit_code_dispatcher
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<job_chain orders_recoverable="yes title="Sample for a job chain with handling exit codes" nametitle="job_chain_exit_code_dispatcherExample for a job chain with handling exit codes"> <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> |
...
Related Downloads
- Download the files from: sample_errorhandling.zip