...
- The solution implements a job named
sorter
that can be added at the start of any job chain.- This job implements a
spooler_process()
function that suspends all incoming orders. - This job is configured for a single task and with an idle timeout attribute. This means that it will execute incoming orders sequentially.
- Having received the last available order this job will wait for the duration specified with the
idle_timeout
attribute for new orders.- The idle timeout is configured using, for example
<job idle_timeout="10">
with thesorter
job definition. - Once the idle timeout has expired this job will execute its
spooler_exit()
function and then sort and move all orders that have previously been suspended.- Sorting is done in alphabetical order.
- The orders are moved to the next job chain node that follows the
sorter
job in the job chain.
- The idle timeout is configured using, for example
- This job implements a
- The download example uses a job chain named
job_chain1
that includes the job nodes for thesorter
job and ahello
job. This job chain accepts ad hoc orders that are added by JOC and it can easily be modified to watch for incoming files and to create an order for each file. - Hint: to re-use the
sorter
job you can:- store the job in a central folder and reference the job in individual job chains.
- move the job's JavaScript code to a central location and use an appropriate
<include>
element for individual job scripts.
Job: request_resource_lock
- This job can be used by resource lock consumers as the first job node in a job chain.
- The job has no special job script implementation.
- The job makes use of the Monitor request_resource_lock.
Monitor: request_resource_lock
This Monitor implements a pre-processing script for jobs that request resource locks.
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; } |
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.
...