Versions Compared

Key

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

...

Flowchart
# order_A [shape="ellipse",label="Order A\n start time: Friday 08:00 ",fillcolor="violet"]
# order_B [shape="ellipse",label="Order B\n start time: Friday 07:00 ",fillcolor="violet"]
# order_Z [shape="ellipse",label="Order Z\n start time: Friday 15:00 ",fillcolor="violet"]
 
job_chain_1 [label="Job Chain 1\nhas no relevant dependencies",fillcolor="orange"]
job_chain_2 [label="Job Chain 2\nis started by Job Chain 1",fillcolor="violet"]
job_chain_3 [label="Job Chain 3\nis started by Job Chain 1",fillcolor="lightskyblue"]
job_chain_4 [label="Job Chain 4\nis started by Job Chain 1",fillcolor="aquamarine"]
job_chain_5 [label="Job Chain 5\nis started by Job Chain 1",fillcolor="orangered"]
job_chain_6 [label="Job Chain 6\nis started by Job Chain 4",fillcolor="yellow"]


split1 [label="Split 1", fillcolor="orange"]
job1 [label="Job 1", fillcolor="orange"]
job2 [label="Job 2", fillcolor="orange"]
sync1 [label="Sync 1", fillcolor="orange"]
job1_2 [label="Job 1.2", fillcolor="orange"]

job3 [label="Job 3", fillcolor="violet"]
job4 [label="Job 4", fillcolor="violet"]

job5 [label="Job 5", fillcolor="lightskyblue"]
job6 [label="Job 6", fillcolor="lightskyblue"]

job7 [label="Job 7", fillcolor="aquamarine"]
job8 [label="Job 8", fillcolor="aquamarine"]
job9 [label="Job 9", fillcolor="aquamarine"]

job10 [label="Job 10", fillcolor="orangered"]
job11 [label="Job 11", fillcolor="orangered"]
job12 [label="Job 12", fillcolor="orangered"]

job13 [label="Job 13", fillcolor="yellow"]

job_chain_1 -> split1
split1 -> job1 -> sync1
split1 -> job2 -> sync1
sync1 -> job1_2
 
job1 -> job_chain_2 -> job3 -> job4
job2 -> job_chain_3 -> job5 -> job6

job1_2 -> job_chain_4 -> job7 -> job8 -> job9
job1_2 -> job_chain_5 -> job10 -> job11 -> job12


job9 -> job_chain_6 -> job13

# job8 -> job4
# job11 -> job4
# job11 -> job6
job4 -> job8 [arrowhead="normal", color="lightslategrey"]
job4 -> job11 [arrowhead="normal", color="lightslategrey"]
job6 -> job11 [arrowhead="normal", color="lightslategrey"]
job13 -> job12 [arrowhead="normal", color="lightslategrey"]

Implementation

Components

  • All Chains below are only to be run when required and have no Orders assigned
  • Chain1 runs Job1 and Job2 in parallel
  • On successful completion of Job1, Chain2 is run
  • On successful completion of Job2, Chain3 is run
  • Chain2 runs Job3 and Job4
  • Chain3 runs Job5 and Job6
  • Chain4 runs after successful completion of Chain1
    • Chain4 runs Job7, Job8 and Job9 
    • Job7 runs 1st
    • Job8 runs once Job7 and Job4 have run successfully
    • Job9 runs once Job8 has completed successfully
  • Chain5 runs after successful completion of Chain1
    • Chain5 runs Job10, Job11 and Job12 
    • Job10 runs 1st
    • Job11 runs once Job10, Job4 and Job6 have run successfully
    • Job12 runs once Job11 has completed successfully
  • Chain6 runs once Job9 and Job12 have completed successfully
  • The solution contains six job chains:
    • JobChain1 runs Job1 and Job2 in parallel.
      • On successful completion of Job1 then JobChain2 is run
      • On successful completion of Job2 then JobChain3 is run
    • JobChain2 runs Job3 and Job4
    • JobChain3 runs Job5 and Job6
    • JobChain4 runs after successful completion of JobChain1
      • JobChain4 runs Job7, Job8, Job9
      • Job7 runs 1st
      • Job8 runs once Job7 and Job4 have run successfully
    • JobChain5 runs after successful completion of JobChain1
      • JobChain5 runs Job10, Job11 and Job12
      • Job10 runs 1st
      • Job11 runs once Job10, Job4 and Job6 have run successfully
      • Job12 runs once Job11 has completed successfully
  • The solution contains three job chains:
    • job_chain_A and job_chain_B represent the predecessor job chains that have no relevant dependencies with job_chain_Z.
    • job_chain_Z is the final job chain that checks if job_chain_A and job_chain_B have already been executed successfully.
  • The solution implements a job check_predecessor_job_chain_Z that has been added at the start of job_chain_Z.
    • This job makes use of a parameter check_job_chains that is assigned a semicolon separated list of job chain names.
      • Job chain names can be specified with an absolute path (starting from the live folder) or with a path relative to the directory of this job.
      • Example:
        • check_job_chains = job_chain_A;job_chain_B
    • This job implements a spooler_process() function that reads the parameters and checks the job cahin history for successful execution of the job chains specified by the parameter.
    • Should all checks for previous successful execution provide a positive result then the current order will be moved to the next job chain node. Otherwise the current order is set back and will be repeated regularly according to the setback configuration for this job.

Usage

  • Positive Check
    • Add an order to job_chain_A using JOC's Add Order context menu.
      • The order should pass through the job chain without errors.
    • Add an order to job_chain_B using JOC's Add Order context menu.
      • The order should also pass through the job chain without errors.
    • Add an order to job_chain_Z using JOC's Add Order context menu.
      • The order should pass through the job chain without errors as all pre-conditions are met.
  • Negative Check
    • Modify the job do_something_job_chain_A to include an error, e.g. by adding the command exit 1 as the final line in the job script.
    • Add an order to job_chain_A:
      • The order should proceed with an error.
    • Add an order to job_chain_Z
      • The order should proceed with an error that is visible in the order log. This error will state that the predecessor job did not complete successfully.
      • The order will be set back and will be repeated according to the setback intervals that have been specified for the job check_predecessor_job_chain_Z.
    • Removing the modification to job do_something_job_chain_A and adding an order to job_chain_A that then runs successfully should result in a successful run of job_chain_Z - either by a new order added to job_chain_Z or by the next execution of the previous order that has been set back.

...