...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
function spooler_process_before() { var resourceJobChainParamDefault = "/resource_lock_provider/resource_lock_provider"; var resourceLockJobChainParam = "resource_job_chain"; var resourceLockNameParam = "resource_lock"; var resourceLockWakeUpParam = "resource_lock_wake_up"; var order = spooler_task.order; var params = spooler.create_variable_set(); params.merge( spooler_task.params ); params.merge( order.params ); // name of the requested resource: explicitely set by parameter or assuming the current job chain path var resourceLock = params.value( resourceLockNameParam ); if ( !resourceLock ) { resourceLock = order.job_chain.path; } // name of the job chain that handles resource locks var resourceJobChainName = params.value( resourceLockJobChainParam ); if ( !resourceJobChainName ) { resourceJobChainName = resourceJobChainParamDefault; } // order wake up parameter indicates that order has acquired resource lock if ( params.value( resourceLockWakeUpParam ) == "yes" ) { spooler_log.info( ".. order acquired resource lock: " + resourceLock ); return true; } else if ( params.value( resourceLockWakeUpParam ) == "no" ) { spooler_log.info( ".. order suspended and waiting for resource lock: " + resourceLock ); order.state = order.job_chain_node.state; order.suspended = true; return false; } var resourceJobChain = spooler.job_chain( resourceJobChainName ); var resourceOrder = spooler.create_order(); var resourceParams = spooler.create_variable_set(); resourceParams.set_var( "requestor_job_chain", order.job_chain.path ); resourceParams.set_var( "requestor_order", order.id ); resourceOrder.params = resourceParams; resourceOrder.title = resourceLock; resourceOrder.at = "now+2"; if ( (order.job_chain.path + "/" + order.id).length <= 100 ) { resourceOrder.id = order.job_chain.path + "/" + order.id; } resourceJobChain.add_order( resourceOrder ); spooler_log.info( ".. order requested resource lock: " + resourceLock ); params.set_var( resourceLockWakeUpParam, "no" ); order.state = order.job_chain_node.state; // always suspend current order, it will be waked up by the requested resource lock order.suspended = true; return false; } |
...
- The following test cases are available with the Resource Lock Consumer sample job chain.
- Run test case 1: Check resource lock on first job step
- The job chain
test_case_1
makes use of the/resource_lock_provider/request_resource_lock
job as the first job node. - No parameterization is used, therefore the scope of the resource lock is the current job chain that is forced to process order sequentially.
- Adding multiple orders to this job chain causes all orders to be processed only after predecessor orders completed the job chain.
- Start the orders
test_case_1-1, ..., test_case_1-3
by use of JOC. - Add any number of new orders by use of JOC with the Add Order context menu.
- Start the orders
- The job chain
- Run test case 1A: Check resource lock on first job step with common resource lock for test case 1
- The job chain
test_case_1A
is a copy oftest_case_1
but makes use of the same resource lock astest_case_1
. - The orders
test_case_1A-1, ..., test_case_1A-3
use the parameterresource_lock
with the value/resource_lock_consumer/test_case_1
therefore forcing orders for both job chains to be processed sequentially:- Start the orders
test_case_1-1, ..., test_case_1-3
by use of JOC that will run for job chaintest_case_1
. - Start the orders
test_case_1A-1, ..., test_case_1A-3
by use of JOC that will run in job chaintest_case_1A
but are synchronized with orders of job chaintest_case_1
.
- Start the orders
- The job chain
- Run test case 2: Check resource lock on each job step
- This test case is designed to prevent parallel execution of orders in a job chain independent from the job node that orders are started for.
- The job chain
test_case_2
makes use of the jobsjob_step_1_resource_lock
andjob_step_2_resource_lock
. Both jobs are assigned therequest_resource_lock
monitor. The above-mentioned initial job noderequest_resource_lock
is not used as the individual jobs make use of the resource lock monitor. - Adding multiple orders to this job chain causes orders to behave sequentially as for test case 1:
- Start the orders
test_case_2-1, ..., test_case_2-3
by use of JOC. - Add any number of new orders by use of JOC with the Add Order context menu.
- Start the orders
...