Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

The normal behaviour is that Job Scheduler handles exit codes <> 0 as an error. In dependence of the error handling, the order goes to error state or will be suspended/setbacked. You can change this behaviour by implementing a post processing. In this sample example 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.

Here are two approaches: the first handles each exit code and the second is more generic. You switch between the samples examples by changing the exit code of the first step. When exit code is 0, the more generic sample example will be executed. To see this in your environment, you can download the configuration files and put them into any folder in config/live.

...

Code Block
       <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/job.xml job ]order="yes"
             stop_on_error="no"
             title="Just aan SampleExample Job"
             name="job_sample">
            <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/script.xml script ]language="shell">
                <![CDATA[
 Echo here is aan sampleexample
                ]]>
            </script>
  
            <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/run_time.xml run_time]/>
        </job>
 
 

The first sampleexample

Code Block
        <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/job.xml job ]order="yes"
             stop_on_error="no"
             name="job_with_exit_code">
            <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/script.xml script ]language="shell">
                <![CDATA[
 rem this is a shell script ending with an exit code
 exit 0
                ]]>
            </script>
 
            <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/monitor.xml monitor ]name="exitCodeDispatcher"
                     ordering="0">
                <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/script.xml 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: //sampleexample to proceed the job chain at another node
      spooler_log.info("proceeding with next step");
      break;
   case 1: //sampleexample to proceed the job chain at another node
      order.state="300"
      break;
   case 2: //sampleexample 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 sampleexample in Step job_with_exit_code_generic
                    ]]>
                </script>
            </monitor>
 
            <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/run_time.xml run_time]/>
        </job>
 

The second sampleexample

Code Block
        <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/job.xml job ]order="yes"
             stop_on_error="no"
             name="job_with_exit_code_generic">
            <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/params.xml params]/>
 
            <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/script.xml script ]language="shell">
                <![CDATA[
 rem another sampleexample
 exit 98
                ]]>
            </script>
 
            <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/monitor.xml monitor ]name="exitCodeDispatcherGeneric"
                     ordering="0">
                <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/script.xml 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;
 
  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>
 
            <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/run_time.xml run_time]/>
        </job>
    </jobs>

...

Code Block
   <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/job_chain.xml job_chain] orders_recoverable="yes"
                   visible="yes"
                   title="SampleExample for a job chain with handling exit codes"
                   name="job_chain_exit_code_dispatcher">
            <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/job_chain_node.xml job_chain_node] state="firstStep"
                            job="job_with_exit_code"
                            next_state="secondStep"
                            error_state="error"/>
 
            <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/job_chain_node.xml job_chain_node] state="secondStep"
                            job="job_with_exit_code_generic"
                            next_state="200"
                            error_state="error"/>
 
            <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/job_chain_node.xml job_chain_node] state="200"
                            error_state="error"
                            job="job_sample"
                            next_state="300"/>
 
            <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/job_chain_node.xml job_chain_node] state="300"
                            error_state="error"
                            job="job_sample"
                            next_state="400"/>
 
            <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/job_chain_node.xml job_chain_node] state="400"
                            error_state="error"
                            job="job_sample"
                            next_state="success"/>
  
            <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/job_chain_node.xml job_chain_node] state="success"/>
 
            <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/job_chain_node.xml job_chain_node] state="success:2"/>
 
            <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/job_chain_node.xml job_chain_node] state="error"/>
 
            <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/job_chain_node.xml job_chain_node] state="exit.99"/>
 
            <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/job_chain_node.xml job_chain_node] state="exit.default"/>
        </job_chain>