...
- The job makes use of the Monitor
request_resource_lock
.
Monitor: request_resource_lock
...
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+3"; 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; } |
Configuration
- Use the sample job chain
test_case_1
from the Resource Lock Consumer sample or any individual job chain and assign the job/resource_lock_provider/request_resource_lock
as the first job node of the job chain. This configuration will guarantee that all newly created orders that are added to the begin of the job chain will be started after any predecessor orders completed the job chain.
- Should resource lock consistency be required for later job nodes in a job chain, i.e. if orders are created not for the begin of a job chain but for later job nodes, e.g. when using split job nodes, then assign the monitor
/resource_lock_provider/request_resource_lock
to the respective jobs:
Usage
- Add two orders to the
job_chain1
job chain.- Use an order ID in descending alphabetical order, e.g. "cba" for the order ID of the first order and "abc" for the order ID of the second.
- Both orders will be suspended at the first node of the job chain.
- After an idle timeout of 10s both orders will be moved to the next job node in the job chain.
- This time the orders will be processed in ascending alphabetical order.
...