...
- The job chain provided by the sample is not specifiic for this solution, the same applies to the
query
job.. - The
prepare
job is used to dynamically calculate the number of parallel instances of thequery
job. This job creates an order parameterparallel_executions=5
for use with the subsequentgenerate
job. - The
generate
job implements the solution by creating the number of orders specified by theparallel_executions
parameter.- Each order is added the following parameters
number_of_orders
: a copy of theparallel_executions
parameter.order_sequence
: the sequence number of the order created. The sequence starts from 1 up to the value of theparallel_executions
parameter.synchronize_required_orders
: the number of orders that thesynchronize
job waits for. This includes the value of theparallel_executions
parameter incremented by 1 for the main order. The prefixsynchronize
of the parameter name reflects the state that thesynchronize
job node is assigned in the job chain.
- The orders are assigned the state that is associated with the next job node, the
query
job, i.e. the orders will be executed starting with that state. - The orders are assigned the end state that is associated with the
synchronize
job.
- Each order is added the following parameters
- The
query
job is configured for a maximum number of 3 parallel tasks via the attribute<job tasks="3">
. It could be configured for any number of parallel tasks. For the sake of this sample the limitation shows the behavior of the job to wait for processes to become free that could be assigned to subsequent orders for the same job. - The job
synchronize
is used to synchronize splitted orders and is provided by the Sync JITL Job with the Java classcom.sos.jitl.sync.JobSchedulerSynchronizeJobChainsJSAdapterClass
.- This job is used without parameters.
- Hint: to re-use the
generate
job you can- store the job to some central folder and reference the job in individual job chains.
- move the JavaScript code of the job to come central location and use a corresponding
<include>
element for individual job scripts.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<?xml version="1.0" encoding="ISO-8859-1"?> <job order="yes" stop_on_error="no" title="Generate orders for parallel processing" name="generate"> <params > <param name="sync_state_name" value="synchronize"/> </params> <script language="java:javascript"> <![CDATA[ function spooler_process(){ var currentJobChain = spooler_task.order.job_chain; var currentJobChainName = spooler_task.order.job_chain.name; params = spooler.create_variable_set(); params.merge( spooler_task.params ); params.merge( spooler_task.order.params ); var numOfOrders = params.value("parallel_executions"); spooler_log.info(" creating " + numOfOrders + " orders"); var syncParameterName = currentJobChainName + "_required_orders"; var numOfRequiredOrders = parseInt( numOfOrders )+1; params.set_var( syncParameterName, numOfRequiredOrders ); for (var i = 1; i <= numOfOrders; i++) { var subOrder = spooler.create_order() var subParams = spooler.create_variable_set(); subParams.set_var( "number_of_orders", numOfOrders ); subParams.set_var( "order_sequence", i ); subParams.set_var( syncParameterName, numOfRequiredOrders ); subOrder.params = subParams; subOrder.state = spooler_task.order.job_chain_node.next_state; subOrder.end_state = params.value( "sync_state_name" ); currentJobChain.add_order( subOrder ); spooler_log.info( "order has been added: " + i ); } spooler_task.order.params.set_var( syncParameterName, numOfRequiredOrders ); spooler_task.order.state = params.value( "sync_state_name" ); return true; } ]]> </script> <run_time /> </job> |
...