Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Minor corrections to text, page formatted

...

The communication with JobScheduler takes place via TCP, where XML commands are transmitted. You can check the documentation for the possible XML commands: http://www.sos-berlin.com/doc/en/scheduler.doc/index.xml

Note:

All changes, which are made using the xml-commands vie TCP-communication are not persistent. E.g. This means, for example, added jobs are no longer available after restarting the JobScheduler.

Example

Adding of a job with the name myJob. The Job runs once a day at 6pm and lists the table c:\temp.

Code Block
            <add_jobs>
              <job name="myJob"
                   title = "my first job">
                <script language="shell">
                <![CDATA[
                    dir c:\temp
                ]]>
                </script>
                <run_time>
                   <period single_start="18:00"/>
                </run_time>
              </job>
           </add_jobs>

 

Example with Telnet

telnet localhost 4454

...

After the JobScheduler has answered, you can view the Job in the JobScheduler's web interface, JOC.

 

Evaluate Answer 

The following function delivers the JobScheduler's answers in a single string. The JobScheduler delivers the answer via the same socket as was previously used during fputs, e.g. the answer can also be delivered directly after fputs.

Code Block
languagephp
linenumberstrue
       function get_answer($socket) {
       $answer = ''; $s = '';
       while ( !ereg("</spooler>", $s) && !ereg("<ok[/]?>", $s) ) {
         $s = fgets($socket, 1000);

         if (strlen($s) == 0) { break; }
         $answer .= $s;
         $s = substr($answer, strlen($answer)-20);


         // chr(0) am Ende entfernen.
         if (substr($answer, -1) == chr(0)) {
           $answer = substr($answer, 0, -1);
           break;
         }
       }
       $answer = trim($answer);

       return $answer;
     }

Communication with PHP Classes

 

For an application that sends commands to the JobScheduler it is very usefull to have a proper error handling. Apart from that, a higher level of abstraction is useful for understanding the source code. For this reason SOS GmbH offers a class for processing the communication. The class encapsulates the socket calls and provides a method for reading XML answers of the JobScheduler.

...

Code Block
languagephp
linenumberstrue
//open socket
$command = new SOS_Scheduler_Command(‘localhost’,4454, 60);
//build command
$cmd = '<add_jobs><job name="myJob" title = "my first job"> <script';
$cmd += 'language="shell">  <![CDATA[dir c:\temp  ]]>  </script> ';
$cmd += '<run_time> <period ';
$cdm += 'single_start="18:00"/></run_time></job></add_jobs>';
if (!$command->connect()) {
echo$get_error(). __FILE__ . __LINE__ ;
return 0;
}
//send command
$this->command->command($cmd);
if ($command->get_answer_error()) {
echo$command->get_error() . ‘ ‘ . __FILE__ . ‘ ‘ . __LINE__ ;
}
//close socket
$command->disconnect();

...

 

Commands with xml-php Interface

...

Within your application you have to setup the Include directory.

 

Code Block
languagephp
linenumberstrue
ini_set( 'include_path', 'packages' );


Example

The example with these classes is realized as follows:

Code Block
languagephp
linenumberstrue
if(!defined('APP_SCHEDULER_HOST')) { define ( 'APP_SCHEDULER_HOST', 'localhost' ); }
if(!defined('APP_SCHEDULER_PORT')) {define( 'APP_SCHEDULER_PORT', '4454' ); }

//load missing classes and returns an object of the class
function &get_instance($class, $include_path='scheduler/', $extension='.inc.php') {
	if ( !class_exists($class) ) {
		include( $include_path . strtolower($class) . $extension );
	}
	$object = new $class;
	$object->host=APP_SCHEDULER_HOST;
	$object->port=APP_SCHEDULER_PORT;
	return $object;   
}
$job = &get_instance('SOS_Scheduler_Job','scheduler/');

//Setting some properties
$job->name           = "myJob";
$job->title          = "my first job ";

//Set the implentation
$job->script('shell')->script_source='dir c:\temp';

//The job has a runtime 
$job->run_time()->period()->single_start = "18:00";
$job_command = &get_instance('SOS_Scheduler_JobCommand_Launcher','scheduler/');

if (! $job_command->add_jobs($job))  {
	echo'error occurred adding job: ' . $job_command->get_error(); 
	exit; 
}

...

Example of Use

 

For the following examples it is assumed that this code is preceeding.The following code should precede the code presented in the examples below:

 
Code Block
languagephp
linenumberstrue

 

if(!defined('APP_SCHEDULER_HOST')) { define ( 'APP_SCHEDULER_HOST', 'localhost' ); }

...


if(!defined('APP_SCHEDULER_PORT')) {define( 'APP_SCHEDULER_PORT', '4454' ); }

...

 


//load missing classes and returns an object of the class

...


function &get_instance($class, $include_path='scheduler/', $extension='.inc.php') {

...


	if ( !class_exists($class) )

...

 {
		include( $include_path . strtolower($class) . $extension );

...

   }

...

   $object = new $class;

...


}
	$object = new $class;
	$object->host=APP_SCHEDULER_HOST;

...


	$object->port=APP_SCHEDULER_PORT;

...

 

...

   return $object;   

...


	return $object;   
} 

 

The use of the php-xml interface is explained. You can find a detailed documentation of the classes in the formats PHP and DOC under: http://www….

 

At the end of each example you can see the XML code that will be send to JobScheduler.

...

Adding a Order to a Job Chain

 
Code Block
languagephp
firstline15
linenumberstrue

 

//-------------------------------------------------------------------------

...

  
// How to add an order to an existing jobchain

...


//-------------------------------------------------------------------------

...

 
    

$order_launcher

...

 =
       &get_instance('SOS_Scheduler_OrderCommand_Launcher','scheduler/');

...

 

...

 


//Create an add_order object (SOS_Scheduler_Command_Add_Order).

...


$order = $order_launcher-

...

>add_order('jobchain',1);

...

 

...

 


//Setting some properties of the order object

...


$order-

...

>id='sostest_12';

...


$order-

...

>replace="yes";

...


$order-

...

>priority="10";

...

 
$order-

...

>title="Testorder";

...

 
$order-

...

>web_service="";

...

 
$order-

...

>at="now+60";

...


$order-

...

>addParam('test','any value');

...

 


// Sending XML to the JobScheduler

...


if (!$order_launcher-

...

>execute($order)) {

...


	echo'error occurred adding order: ' .

...

  $order_launcher-

...

>get_error();
	exit;
}

 

 

...

Generated XML

Code Block
     <add_order
        at="now+60"
        id="sostest_12"
        job_chain="jobchain"
        priority="10"
        replace="yes"
        state="1"
        title="Testorder">
    <params>
    <param name="test" value="any value"/>
    </params>
    </add_order>

...

 

...


...

Remove an Order from a Job Chain

Code Block
languagephp
linenumberstrue
 

...

  1. //------------------------------------------------------------------------- 
  2. // How to add an order to an existing jobchain
  3. //-------------------------------------------------------------------------   
  4.  
  5. $order_launcher =
  6.        &get_instance('SOS_Scheduler_OrderCommand_Launcher','scheduler/');
  7.  
  8.  
  9. //Create an add_order object (SOS_Scheduler_Command_Add_Order).
  10.   $order = $order_launcher->add_order('jobchain',1);
  11.  
  12.  
  13. //Setting some properties of the order object
  14.   $order->id='sostest_12';
  15.   $order->replace="yes";
  16.   $order->priority="10"
  17.   $order->title="Testorder"
  18.   $order->web_service=""
  19.   $order->at="now+60";
  20.   $order->addParam('test','any value');
  21.  
  22. // Sending XML to the JobScheduler
  23.   if (!$order_launcher->execute($order)) {
  24.     echo 'error occurred adding order: '$order_launcher->get_error(); exit;
  25.   }
  26.  

 

...


Generated XML

Code Block
 
    <remove_order  order="sostest_13" job_chain="jobchain"/>

...

 

...

Change an Existing Order

Code Block
languagephp
linenumberstrue
 

 

 

...

//------------------------------------------------------------------------

...


//How to change an existing order

...


//------------------------------------------------------------------------

...

 
  

//starting with adding an order.

...


$order_launcher

...

 =
       &get_instance('SOS_Scheduler_OrderCommand_Launcher','scheduler/');

...

 

$order = $order_launcher-

...

>add_order('jobchain',3);

...


$order-

...

>replace='yes';

...


$order-

...

>id='sostest_14';

...


$order-

...

>run_time()-

...

>single_start="22:00";

...

 


if (!$order_launcher-

...

>execute($order)) {

...


	echo'error occurred adding order: ' . $order_launcher-

...

>get_error(); exit;

...

}

...

 

}

//Now change the order.state

...


$order = $order_launcher-

...

>modify_order('jobchain','sostest_14');

...


$order-

...

>state=2;

...


if (!$order_launcher-

...

>execute($order)) {

...


	echo'error occurred modifying order: ' . $order_launcher-

...

>get_error();
	exit;

...


}

...

 

 

...

Generated XML

Code Block

...

 <modify_order  order="sostest_14" job_chain="jobchain" state="2"></modify_order>
Code Block
 

 

...

Start an Order with Submit

Code Block
languagephp
linenumberstrue
 

 

//-----------------------------------------------------------------------

...


// How to start an order with submit.

...

 
// This can be usefull, when you know orders jobchain, id, state and starttime.

...


//------------------------------------------------------------------------

...

 

$order_launcher

...

 =
       &get_instance('SOS_Scheduler_OrderCommand_Launcher','scheduler/');

...

 

if (! $order_launcher-

...

>submit('jobchain','sostest_15',2,'now+30')) {

...


	echo'error occurred submitting order: ' . $order_launcher-

...

>get_error();
	exit;

...


}

...

 

...


Generated XML

Code Block
 

...

   <add_order
      at="now+30"
      id="sostest_15"
      job_chain="jobchain"
      replace="yes"
      state="2">
    </add_order>
 

...

 

Adding a Job

Code Block
languagephp
linenumberstrue
 //------------------------------------------------------------------------
// How to add a job
//------------------------------------------------------------------------

$job = &get_instance('SOS_Scheduler_Job','scheduler/');

//Setting some properties
$job->force_idle_timeout   = "yes";
$job->idle_timeout         = "1000";
$job->ignore_signals       = "all";
$job->java_options         = "java";
$job->min_tasks            = "2";
$job->name                 = "test_jobname3"; 
$job->order                = "no";
$job->priority             = "1" ;
$job->stop_on_error        = "no";
$job->tasks                = "4";
$job->temporary            = "no"; 
$job->timeout              = "10";
$job->title                = "my job";
$job->visible              = "yes"; 

//Defining some parameters
$job->addParam('var1','value1');
$job->addParam('var2','value2');

//Set the implentation
$job->script('javascript')->script_source='a=1;';

//The job has a runtime
$job->run_time()->period()->single_start = "10:00";
$job->run_time()->period()->single_start = "11:00";
$job->run_time()->at('2006-12-24 12:20');
$job->run_time()->at('2006-12-24 12:25');
$job->run_time()->at('2006-12-24 12:35');

/** A period for day=1 */
$p = $job->run_time()->weekdays('1')->period();
$p->single_start = '07:30';
$job_command = &get_instance('SOS_Scheduler_JobCommand_Launcher','scheduler/');

//First removing the job    
$job_command->remove($job->name);
if (! $job_command->add_jobs($job))  {
	echo'error occurred adding 

...

 

 

Adding a Job

Code Block
languagephp
linenumberstrue
 job: ' . $job_command->get_error(); exit;


 

//------------------------------------------------------------------------

// How to add a job

//------------------------------------------------------------------------

 

$job = &get_instance('SOS_Scheduler_Job','scheduler/');

 

  •  
  • //Setting some properties

    $job->force_idle_timeout   = "yes";

    $job->idle_timeout         = "1000";

    $job->ignore_signals       = "all";

    $job->java_options         = "java";

    $job->min_tasks            = "2";

    $job->name                 = "test_jobname3"

    $job->order                = "no";

    $job->priority             = "1" ;

    $job->stop_on_error        = "no";

    $job->tasks                = "4";

    $job->temporary            = "no"

    $job->timeout              = "10";

    $job->title                = "my job";

    $job->visible              = "yes";

     

     

  •  
  •  
  • //Defining some parameters

    $job->addParam('var1','value1');

    $job->addParam('var2','value2');

     

  •  
  • //Set the implentation

    $job->script('javascript')->script_source='a=1;';

  •  
  •  

    //The job has a runtime

     

    $job->run_time()->period()->single_start = "10:00";

     

    $job->run_time()->period()->single_start = "11:00";

  •  
  •  

    $job->run_time()->at('2006-12-24 12:20');

     

    $job->run_time()->at('2006-12-24 12:25');

     

    $job->run_time()->at('2006-12-24 12:35');

  •  
  •  

     

    /** A period forr day=1 */

     

    $p = $job->run_time()->weekdays('1')->period();

     

    $p->single_start = '07:30';

     

     

    $job_command = &get_instance('SOS_Scheduler_JobCommand_Launcher','scheduler/');

  •  
  •  
  •  

    //First removing the job   

     

    $job_command->remove($job->name);

     

    if (! $job_command->add_jobs($job))  {

     

    echo'error occurred adding job: ' . $job_command->get_error(); exit;

     

     

    ...


    Generated XML

     
    Code Block

    ...

       <job
          force_idle_timeout="yes"
          idle_timeout="1000"
          ignore_signals="all"
          java_options="java"
          min_tasks="2"
          name="test_jobname3"
          order="no"
          priority="1"
          stop_on_error="no"
          tasks="4"
          temporary="no"
          imeout="10"
          itle="my job"
          isible="yes">
        <params>
          param name="var1" value="value1"/>
          param name="var2" value="value2"/>
        </params>
        <script language="javascript">
          ![CDATA[a=1;]]></script>
        <run_time>
          period single_start="10:00"/>
          period single_start="11:00"/>
          at at="2006-12-24 12:20"/>
          at at="2006-12-24 12:25"/>
          at at="2006-12-24 12:35"/>
          weekdays>
            day day="1">
            period single_start="07:30"/>
            day>
          </weekdays>
        </run_time>
        </job> 
     job>
      

     

    ...

     

    Deleting a Job

    Code Block
    languagephp
    linenumberstrue
     

    ...