Date: Thu, 28 Mar 2024 21:50:13 +0000 (UTC)
Message-ID: <1239685633.12019.1711662613148@change.sos-berlin.com>
Subject: Exported From Confluence
MIME-Version: 1.0
Content-Type: multipart/related;
boundary="----=_Part_12018_1099686642.1711662613148"
------=_Part_12018_1099686642.1711662613148
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Content-Location: file:///C:/exported.html
Scope
The Join Orders Job (Jo=
bSchedulerJoinOrders) is a JITL=
Job and is used to join up parallel executing child segments in a Job Chain. It then continues processing=
with a single Order in a single thread once processing of the parallel thr=
eads has been completed. It is used in two Job Chain Patterns - Split a=
nd Join and "Y".
This article describes how the Join Orders Job can be used in a=
"Y" pattern - the How to Execu=
te Jobs in a Job Chain in Parallel article describes its use in a S=
plit and Join pattern.
The Join Orders Job is only available for JobScheduler versions=
1.11.4 and newer. FEATURE AVAILABILITY STARTING FROM RELEASE 1.11.4=
span>
- See the How To Synchronize Job Execution Across Job Chains ar=
ticle for information about using the Sync Job (JobSchedulerSynchronizeJobChains) to synchronize Jobs in different Job Chains and to join up para=
llel executing child Job Chain segments in JobScheduler versions 1.11.3 and=
older.
- The Join Orders Job provides a plug-in replacement for the Sync =
Job for sync/join operations within a Job Chain. As the Join O=
rders Job is significantly faster than the Sync Job, users of=
JobScheduler 1.11.4 or newer wishing to improve performance of the Syn=
c Job can simply replace their Sync Job with the Join Ord=
ers Job.
Join Pattern=
s
The example described in this article shows the use of a single instance=
of the Join Orders Job within a single Job Chain. Multiple instan=
ces of the Join Orders Job can also be used within a Job Chain. Se=
e the Configuration section of the JobSchedulerJoinOrders documentation for more information. <=
em>
s=
plit and join Pattern
The configuration of the Join Orders Job for use in the Spl=
it and Join pattern is described in the How to Execute Jobs in a Job Chain in Parallel article.=
p>
Relevant for the current article is that in the Split and Join =
pattern, the Split Job generates the configuration information req=
uired by the Join Orders job. This information must be configured =
separately for the "Y" pattern. The information generated by the the Sp=
lit Job is:
- a parameter -
required_orders
- which is forwarded to=
the Join Job. This parameter defines the number of orders that th=
e Join Orders Job has to receive before processing the Job Chain c=
ontinues with processing of the Join Orders Job itself
- an Order for each of the child Job Chain segments that is to be process=
ed in parallel. The end state of each of these Orders is the state of the <=
em>Join Orders Job.
'Y' Pattern
The following diagram shows the "Y"-pattern Job Chain used in the exampl=
e download archive that is linked from this article.
- Note that the generate and wait Jobs in this example =
have been included to make the example work and are not required for its op=
eration in "normal" use.
- All Jobs in the "Y"-pattern are configured as a single Job Chain.<=
/li>
- The parallel arms of the example are effectively job_a to the =
Join Orders Job and job_b to the Join Orders Job.
- Download the example y_join.zip.=
- Extract the archive to a folder
./config/live
of=
your JobScheduler Master installation.
- The archive will extract the files to a folder
y_join.
&nbs=
p;
- The
y_join
folder can be renamed if required, the solution=
does not require the use of specific folder or Job names.
- Change the path to the example Job Chain in line 14 of the generate=
_orders Job below to the correct setting.
Exampl=
e Description
To use the example, first start the Parent Order (in this example ma=
in_order). This Order has been configured with three parameters, one o=
f which - required_orders - is required by the Join Orders Job. The other two parameters - generate_orders and duration=
_wait_job are only used to provide a convenient way of making the exam=
ple work.
- The required_orders parameter is read immediately by the =
Join Orders Job, which will then wait in the suspended st=
ate until the number of Orders specified in the parameter (here it is 10) h=
ave been processed.
- The main_order moves to the generate_orders Job,=
which generates a total of 8 Child Orders.
- This number is specified in a second parameter for the main_order=
em> - generate_orders.
- 4 of these child orders be processed in one arm of the "Y" - i.e. start=
ing at node 200 - and 4 will be processed in the other arm - i.e. starting =
at node 300. All the Child Orders will end at the Join Job.
- The branch of the Job Chain the Child Orders have been executed on is n=
ot important for the Join Orders Job.
- All these Child Orders will be counted towards the required_orders<=
/em> parameter.
- Child Orders are identified by the Join Orders Job when they e=
ither:
- Have an Id based on the Parent Order ID plus an underscore plus a strin=
g.
- For example, the first generated Child Order in the example will be giv=
en the ID main_order_0.
- This is the method used in the example.
- They carry a join_session_id parameter, specifying the I=
D of the Parent Order.
- The main_order itself then moves to the wait Job=
where it waits for a time specified in the main_order's =
duration_wait_job parameter (here 30 seconds).
- The sole purpose of this delay is to demonstrate that the main_orde=
r can reach the Join Orders Job after Child Orders.<=
/li>
- This delay is not necessary for the functioning of the Join Orders<=
/em> Job and the example will work with the duration_wait_job=
parameter set to its minimum value of 1 (0 will cause an error).
- When the main_order reaches the Join Orders Job it wi=
ll be counted towards the number of Orders specified in the requir=
ed_orders parameter, making a total of 8 + 1 =3D 9 Orders after =
all the generated Child Orders have been completed.
- Note that the main_order is the only Order that will be counte=
d that does not have to have the state of the Join Orders Job as i=
ts end state.
- The main_order will now be suspended at the Join Orders Job (without the Job being processed) until:
- a further Order that has the state of the Join Orders Job as i=
ts end state is completed.
The main_order_add-order Order can now be used to increase the =
the total number of Orders counted by the Join Orders Job by 1.
- In the current example, running the main_order_add-order =
Order once will cause the number of Orders counted to reach the value set i=
n the required_orders parameter (10).
- The Join Orders Job will now process the main_order=
em> which will then proceed along the Job Chain - in this example to the Job C with the state 400.
- The ID of this Order has to follow one of the conventions used to ident=
ify Child Orders. Here the ID of the parent Order plus an underscore plus a=
string has been used.
- Note that this string may not contain an underscore character ("_") and=
therefore the string "add-order" has been used.
Note that Child Orders such as the generated Orders or the manually star=
ted main_order_add-order Order in this example will only be recogn=
ized as such when they are started after the Parent Order has been started.=
The Job Chain, Jobs and Orders
The Job Chain=
The Job Chain is shown in the diagram near the top of this article and i=
s listed in the code block below.
<?xml version=3D"1.0" encoding=3D"ISO-8859-1"?>
<job_chain title=3D"Y Join">
<job_chain_node state=3D"100" job=3D"generate_orders" next_state=3D=
"150" error_state=3D"error"/>
<job_chain_node state=3D"150" job=3D"wait" next_state=3D"200" error=
_state=3D"error"/>
<job_chain_node state=3D"200" job=3D"job_a" next_state=3D"join" err=
or_state=3D"error"/>
<job_chain_node state=3D"300" job=3D"job_b" next_state=3D"join" err=
or_state=3D"error" delay=3D"10"/>
<job_chain_node state=3D"join" job=3D"join" next_state=3D"400" erro=
r_state=3D"error"/>
<job_chain_node state=3D"400" job=3D"job_c" next_state=3D"success" =
error_state=3D"error"/>
<job_chain_node state=3D"success"/>
<job_chain_node state=3D"error"/>
</job_chain>
The Jobs
The =
Join Orders Job
The Join Orders Job basically counts incoming Jobs. This makes =
it significantly faster than the Sync Job mentioned in the Scope section above,=
which checks the incoming Jobs for completeness.
The configuration of the Join Orders Job can set using the JITL=
Job Wizard in JOE and is shown in following code block. Relevant for users=
in the following listing is the show_join order list parameter wh=
ich may be optionally set (default is false). Setting this Paramet=
er to true causes a list of all the orders counted by the Join=
Orders Job to be written to the Parent Order log file.
<?xml version=3D"1.0" encoding=3D"ISO-8859-1"?>
<job order=3D"yes" stop_on_error=3D"no" idle_timeout=3D"60" title=3D"Jo=
in Job">
<params >
<param name=3D"show_join_order_list" value=3D"true"/>
</params>
<script language=3D"java" java_class_path=3D"" java_class=3D"com.so=
s.jitl.join.JobSchedulerJoinOrdersJSAdapterClass"/>
<run_time />
</job>
Note that the Join Orders Job only counts Orders that have the =
state of the Join Orders Job as their end state (here join).
The generate_orders Job
The configuration of the generate_orders Job is shown in the ne=
xt code block along with the script responsible for the generation of the C=
hild Orders.
Note that this Job is only used to create the current example and is not=
required for the Join Orders Job itself. In a working scheduling =
environment, the orders for the parallel parts of the "Y" would come from o=
ther sources such as Schedules or File Order Sources.
Note also that the Job Chain path (set in line 14 of the script) must be=
modified to suit the actual path used.
<?xml version=3D"1.0" encoding=3D"ISO-8859-1"?>
<job order=3D"yes" stop_on_error=3D"no">
<script language=3D"java:javascript">
<![CDATA[
function spooler_process(){
// merge parameters from task and order
var params =3D spooler_task.params;
params.merge( spooler_task.order.params );
=20
// set variable
var generate_orders =3D params.value( 'generate_orders' );
var jobChain =3D spooler.job_chain('/test/join/y_join/y_join');
// log parameter
spooler_log.info( 'generate_orders =3D ' + generate_orders);
=20
// generate orders
for (i=3D0;i<generate_orders;i++){
var order =3D spooler.create_order();
order.id =3D spooler_task.order.id + "_" + i;
order.params.merge(spooler_task.order.params);
order.end_state=3D"join";
if((i%2)=3D=3D1) {
order.state=3D"200";
} else {
order.state=3D"300";
}
jobChain.add_order(order);
}
return true;
}
]]>
</script>
<run_time />
</job>
The Order starts the first Job (generate) in the y_join Job Chain:
- This Job contains a script that generates the Child Orders (see lines 2=
0 - 31 of the listing).
- The Orders are alternated between the two branches of the Job Chain (ev=
en numbered Orders start at the Job corresponding with the Order state 150 =
and odd numbered Orders at the Job corresponding with the Order state 160).=
All Child Orders terminate at the Join Orders Job.
- The total number of orders generated is determined by the generate_=
orders parameter.
The wait Job=
h5>
The wait Job is configured to read the duration_wait_job parame=
ter and execute a simple script (i.e. ping local host for the length of tim=
e specified in the parameter). This script causes the Job to wait for the n=
umber of seconds specified in the parameter.
The Orders
The Parent=
Order
The Parent Order, in this example, with ID main_order has the f=
ollowing 3 parameters:
- required_orders
- This parameter (Default 10.)
- This parameter is required for the Join Job.
- duration_wait_job
- this is the time in seconds that the wait Job will wait before the main=
Order moves to the Join Orders Job. (Default 30 secs.)
- The duration_job_a parameter is only used in the wait=
Job as part of this example and is not necessary for the functioning =
of the Join Orders Job.
- generate_orders
- this is the number of Orders that are to be generated by the genera=
te_orders Job. (Default 8.)
- The generate_orders parameter is used in the Generate=
Job as part of this example to specify the number of Child Orders that sho=
uld be generated. This parameter is not necessary for the functioning of th=
e Join Job as the Jobs counted by the Join Job could come=
from any number of sources..
<?xml version=3D"1.0" encoding=3D"ISO-8859-1"?>
<order >
<params >
<param name=3D"required_orders" value=3D"10"/>
<param name=3D"duration_job_a" value=3D"30"/>
<param name=3D"generate_orders" value=3D"8"/>
</params>
<run_time />
</order>
The Child =
Orders
T=
he generated Child Orders
Have the ID of the Parent Order (main_order) + "_" + * where * =
is a string - in the current example simple numbers are used a string.
Have either:
<order state=3D"200" end_state=3D"join">
or
<order state=3D"300" end_state=3D"join">
depending on which branch of the Job Chain they should be executed on.=
p>
The main_order_add-order Order
Has the ID of the Parent Order (main_order) + "_" + * where * i=
s a string - in the current example "add-order" is used.
This Order is configured with:
state =3D 300
(The state in the Job Chain where the main_o=
rder_add-order Order starts processing. Here this is job_b) and
end_state =3D join
(The state corresponding to the Joi=
n Job) This means that this Order will be registered by the Join=
em> Job as counting towards the required orders.
<?xml version=3D"1.0" encoding=3D"ISO-8859-1"?>
<order state=3D"300" end_state=3D"join">
<run_time />
</order>
Logging
A parameter can be set for the Join Job - show_join_or=
der_list. When this parameter is set to true the all the Chil=
d Orders counted by the join job will be listed in the Parent Order log fil=
e.
The default setting for this parameter is false.
------=_Part_12018_1099686642.1711662613148
Content-Type: image/png
Content-Transfer-Encoding: base64
Content-Location: file:///C:/fc4225f141daf29dfc09b2bbc4709390
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
------=_Part_12018_1099686642.1711662613148--