Process Classes for use with JobScheduler Agents
- We assume that we have a job in a job chain to be executed on a JobScheduler Agent.
- This requires a process_class that is assigned to the job.
- Please read How to configure a JobScheduler Master and Agent to work together to know how you create the process class for a JobScheduler Agent and how you assign it to a job.
Process Class configuration
Now we assume that we use multiple JobScheduler Agents and we want the job to be executed on different JobScheduler Agents depending on parameters.
Create a process class (e.g. with the name _agents_) in JOE with empty values for host and port. The values for host and port are set dynamically. This should result in the following configuration file ./config/live/agents.process_class.xml:
<?xml version="1.0" encoding="ISO-8859-1"?> <process_class max_processes="30"/>
Assign the process class to the job in JOE. In this example the job has the name shellOnDynamicAgent and calls hostname as a shell command.
So you should see the following content in the configuration file ./config/live/shellOnDynamicAgent.job.xml:
<?xml version="1.0" encoding="ISO-8859-1"?> <job process_class="agents" order="yes" stop_on_error="no"> <script language="shell"> <![CDATA[ #! /bin/sh # returns the hostname of the agent hostname ]]> </script> <run_time/> </job>
Job configuration
Create the following job, e.g. setAgent, and add it to the job chain as the forerunner of the JobScheduler Agent job.
This job modifies the process_class setting of the successor job in the job chain according to the order parameters agent_host_ and _agent_port:
<?xml version="1.0" encoding="ISO-8859-1"?> <job order="yes" stop_on_error="no"> <params /> <script language="java:javascript"><![CDATA[ function spooler_process() { var curOrder = spooler_task.order; var agentHost = curOrder.params.value('agent_host'); var agentPort = curOrder.params.value('agent_port'); var nextJob = curOrder.job_chain_node.next_node.job; spooler_log.info("Params agentHost:agentPort = "+agentHost+":"+agentPort); spooler_log.info("before: "+nextJob.process_class.remote_scheduler); nextJob.process_class.remote_scheduler = agentHost+":"+agentPort; spooler_log.info("after: "+nextJob.process_class.remote_scheduler); return true; } ]]></script> <run_time /> </job>
Job chain configuration
Add these jobs to a job chain, e.g. jobChainWithAgentJob:
This will result in the job chain configuration file ./config/live/jobChainWithAgentJob.job_chain.xml:
<?xml version="1.0" encoding="ISO-8859-1"?> <job_chain orders_recoverable="yes" visible="yes"> <job_chain_node state="setAgent" job="setAgent" next_state="callAgent" error_state="error"/> <job_chain_node state="callAgent" job="shellOnDynamicAgent" next_state="success" error_state="error"/> <job_chain_node state="success"/> <job_chain_node state="error"/> </job_chain>
Order configuration
Add an order to the job chain jobChainWithAgentJob for each JobScheduler Agent.
For example, one JobScheduler Agent runs on HostA with port 4444 and another JobScheduler Agent runs on HostB with port 4444. The order has to be assigned the parameters agent_host_ and _agent_port.
This should result in the order configuration files ./config/live/jobChainWithAgentJob,hostA-4444.order.xml and ./config/live/jobChainWithAgentJob,hostB-4444.order.xml:<?xml version="1.0" encoding="ISO-8859-1"?> <order> <params > <!-- for use with JobScheduler releases before 1.10 <param name="agent_host" value="HostA"/> --> <!-- for use with JobScheduler releases starting with 1.10 --> <param name="agent_host" value="http://HostA"/> <param name="agent_port" value="4444"/> </params> <run_time/> </order>
<?xml version="1.0" encoding="ISO-8859-1"?> <order> <params > <!-- for use with JobScheduler releases before 1.10 <param name="agent_host" value="HostB"/> --> <!-- for use with JobScheduler releases starting with 1.10 --> <param name="agent_host" value="http://HostB"/> <param name="agent_port" value="4444"/> </params> <run_time/> </order>