/********************************************************* begin of preamble
**
** Copyright (C) 2003-2010 Software- und Organisations-Service GmbH.
** All rights reserved.
**
** This file may be used under the terms of either the
**
** GNU General Public License version 2.0 (GPL)
**
** as published by the Free Software Foundation
** http://www.gnu.org/licenses/gpl-2.0.txt and appearing in the file
** LICENSE.GPL included in the packaging of this file.
**
** or the
**
** Agreement for Purchase and Licensing
**
** as offered by Software- und Organisations-Service GmbH
** in the respective terms of supply that ship with this file.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
** IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
** BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
** POSSIBILITY OF SUCH DAMAGE.
********************************************************** end of preamble*/
package sos.scheduler.launcher;
import java.util.HashMap;
import org.w3c.dom.Node;
import sos.scheduler.command.SOSSchedulerCommand;
import sos.util.SOSClassUtil;
import sos.util.SOSLogger;
import sos.util.SOSString;
import sos.xml.SOSXMLXPath;
/**
*
* Klasse JobSchedulerLoadTestLauncher
* Diese Klasse kann die Ausf�hrung paralleler Jobs skalieren und beliebig viele Jobs k�nnen parallel laufen.
* Die Klasse kann beliebig viele individuelle Jobs starten und kann mit dem Namen eines anderen Jobs oder
* Auftrages parametrisiert werden, die gestartet werden soll.
* Die Anzahl zu startenden Jobs in konfigurierbaren Zeitabst�nden sowie die Erh�hung der Anzahl zu startenden Jobs beim Erreichen
* jedes Intervalls sind konfigurierbar.
*
* resourcen: * sos.mail.jar, sos.util.jar, sos.xml.jar, xercesImpl.jar, xml-apis.jar, xalan.jar
*
*
*
* a) Aufruf �ber Kommandozeile
*
* java -cp=. JobSchedulerLoadTestLauncher -config=<Konfigurationsdatei> -job= -host= -port=
*
* Wenn host= bzw. port= gesetzt sind, dann �berschreiben sie die Werte der Konfigurationsdatei
* Ist ein Job-Name angegeben, dann wird versucht aus der Konfigurationsdatei die Parameter dieses
* Jobs zu extrahieren. Ist kein Job-Name angegeben, dann wird das erste Element <params> aus der Konfigurationsdatei ausgelesen.
*
* Inhalt der Konfigurationsdatei. Es kann auch hier ein XML-Konfigurationsdatei eines Schedulers sein.
* <params>
* <param name="" value=""/>
* </params>
*
*
* 2. Parameter
*
* 2.1 Allgemeine Parameter f�r den Launcher
*
* a) <param name="scheduler_launcher_host" value="localhost"/>
*
* Der Host des Job Schedulers, der den Job ausf�hrt, Default: localhost
*
* b) <param name="scheduler_launcher_port" value="4444"/>
*
* Der Port des Job Schedulers, der den Job ausf�hrt, Default: 4444
*
* c) <param name="scheduler_launcher_protocol" value="tcp|udp"/>
*
* Das Protokoll zum Versenden via JobSchedulerCommand, Default: tcp
*
* c) <param name="scheduler_launcher_min_starts" value="5"/>
*
* Die minimale Anzahl von Jobs oder Auftr�gen, die gleichzeitig gestartet werden. Default=1
*
* d) <param name="scheduler_launcher_max_starts" value="100"/>
*
* Die maximale Anzahl von Jobs oder Auftr�gen, die gleichzeitig gestartet werden.
*
* e) <param name="scheduler_launcher_start_increment" value="+10|*2"/>
*
* Die Anzahl zu startender Job oder Auftr�ge wird pro Start um diese Zahl erh�ht. Ein Wert 3 ist gleichbedeutend mit +3, d.h. die Zahl wird um 3 erh�ht.
* Ein Wert *2 bedeutet, dass sich die Anzahl verdoppelt. Das Inkrement gilt nicht beim ersten Start. Die mit dem Parameter max_starts gesetzte Anzahl darf nicht �berschritten werden. Wird sie �berschritten, dann werden alle weiteren Starts mit dem Wert von max_starts ausgef�hrt.
*
* f) alle Parameter, deren Namen nicht mit scheduler_launcher_ beginnen, werden an den Job oder Auftrag durchgereicht.
*
* g) <param name="scheduler_launcher_duration" value="120"/>
* Kriterium um das Programm zu beenden
*
*
* 2.2 Spezielle Parameter f�r Jobs, siehe Beispiel
* <param name="scheduler_launcher_job" value="job_name"/>
* Wenn dieser Parameter �bergeben wurde, dann handelt es sich um einen Job. Der hier �bergebene
* Job-Name ist der Wert des Attributs job= in <start_job job="..."/>
*
* In diesem Fall werden ausgewertet:
*
* a) mandatory
* keine
*
* b) optional, d.h. bitte keine eigenen Defaults, sondern im Fall des Fehlens einfach nicht �bergeben
* <param name="scheduler_launcher_job_after" value="..."/>
* <param name="scheduler_launcher_job_at" value="..."/>
* <param name="scheduler_launcher_job_web_service" value="..."/>
*
* 2.3 Spezielle Parameter f�r Auftr�ge, siehe Beispiel
* <param name="scheduler_launcher_order" value="order_id"/>
* Wenn dieser Parameter �bergeben wurde, dann handelt es sich um einen Auftrag. Die hier �bergebene Auftragskennung ist der Wert des Attributs id= in <add_order id="..."/>
*
* In diesem Fall werden ausgewertet:
*
* a) mandatory
* <param name="scheduler_launcher_order_job_chain" value="..."/>
*
* b) optional, d.h. bitte keine eigenen Defaults, sondern im Fall des Fehlens einfach nicht �bergeben
* <param name="scheduler_launcher_order_replace" value="yes|no"/>
* <param name="scheduler_launcher_order_state" value="..."/>
* <param name="scheduler_launcher_order_title" value="..."/>
* <param name="scheduler_launcher_order_at" value="..."/>
* <param name="scheduler_launcher_order_priority" value="..."/>
* <param name="scheduler_launcher_order_web_service" value="..."/>
* <param name="scheduler_launcher_interval" value="..."/>
*
*
* 2.4 Alle anderen Parameter werden durchgereicht. Genauer: alle Parameter, die nicht mit
* scheduler_launcher_ beginnen, werden den Jobs oder Auftr�gen durchgereicht, die gestartet werden sollen.
*
*
* @author M�r�vet �ks�z
*
* mueruevet.oeksuez@sos-berlin.com
*
*
*/
public class JobSchedulerLoadTestLauncher {
/** Allgemeine Parameter f�r den Launcher */
/** Der Host des Job Schedulers, der den Job ausf�hrt, Default: localhost*/
private String schedulerLauncherHost = "localhost";
/** Der Port des Job Schedulers, der den Job ausf�hrt, Default: 4444 */
private int schedulerLauncherPort = 4444;
/** Das Protokoll zum Versenden via JobSchedulerCommand tcp oder udp, Default: tcp */
private String schedulerLauncherProtocol = "tcp";
/** Die minimale Anzahl von Jobs oder Auftr�gen, die gleichzeitig gestartet wird. Default=1 */
private int schedulerLauncherMinStarts = 1;
/** Die maximale Anzahl von Jobs oder Auftr�gen, die gleichzeitig gestartet werden.
* -1 bedeutet, das kein Parameterwert angegeben ist
*/
private int schedulerLauncherMaxStarts = -1;
/**
* Die Anzahl zu startender Job oder Auftr�ge wird pro Start um diese Zahl erh�ht.
* Ein Wert 3 ist gleichbedeutend mit +3, d.h. die Zahl wird um 3 erh�ht.
* Ein Wert *2 bedeutet, dass sich die Anzahl verdoppelt.
* Das Inkrement gilt nicht beim ersten Start. Die mit dem Parameter max_starts gesetzte Anzahl darf nicht �berschritten werden.
* Wird sie �berschritten, dann werden alle weiteren Starts mit dem Wert von max_starts ausgef�hrt.
* Z.B. value="+10" oder "*2"/>
* Diese Wert wird in zwei Variablen gesplittet:
* schedulerLauncherStartIncrement und schedulerLauncherStartIncrementFactor.
*/
private int schedulerLauncherStartIncrement = 1;
private String schedulerLauncherStartIncrementFactor = "+";
/** Verz�gerung bis zum n�chsten Job Starts*/
private int schedulerLauncherInterval = 0;
/** Abbruchbedingung. Beim Erreichen der Anzahl Sekunden wird das Programm beendet.
* Ist das Programm mitten im Launchen, dann wird so lange darauf gewartet, bis das Ende des Launchens erreicht ist.
* Default ist 120 sek.
* */
private long schedulerLauncherDuration = 120;
/**
* Wird berechnet aus der aktuellen Uhrzeit in Milisekunden + Abbruchbedingung (=>schedulerLauncherDuration * 1000)
*/
private long terminateTimeInSec = 0;
/** Spezielle Parameter f�r Jobs
* Wenn dieser Parameter �bergeben wurde, dann handelt es sich um einen Job.
* Der hier �bergebene Job-Name ist der Wert des Attributs job= in <start_job job="..."/>
*/
private String schedulerLauncherJob = "";
/** Spezielle Parameter f�r Jobs, mandatory*/
private String schedulerLauncherJobAfter = "";
private String schedulerLauncherJobAt = "";
private String schedulerLauncherJobWebService = "";
/**
* Spezielle Parameter f�r Auftr�ge.
* Wenn dieser Parameter �bergeben wurde, dann handelt es sich um einen Auftrag.
* Die hier �bergebene Auftragskennung ist der Wert des Attributs id= in <add_order id="..."/>
*/
private String schedulerLauncherOrder = "";
/** Spezielle Parameter f�r Auftr�ge. mandatory, wenn Parameter schedulerLauncher_order angegeben ist */
private String schedulerLauncherOrderJobChain = "";
/** Spezielle Parameter f�r Auftr�ge.
* Optional, d.h. bitte keine eigenen Defaults, sondern im Fall des Fehlens einfach nicht �bergeben
*/
private boolean schedulerLauncherOrderReplace = true;
private String schedulerLauncherOrderState = "";
private String schedulerLauncherOrderTitle = "";
private String schedulerLauncherOrderAt = "";
private String schedulerLauncherOrderPriority = "";
private String schedulerLauncherOrderWebService = "";
/** Das sos.util.SOSLogger Objekt*/
private SOSLogger sosLogger = null;
/** sos.util.SOSString Objekt */
private SOSString sosString = null;
/** Hilfsparameter, alle aus der Konfigurationsdatei gelesene Parametern werden hier geschrieben */
private HashMap allParam = new HashMap();
/** Argument-Parameter: XML-Konfigurationsdatei
* Inhalt der Konfigurationsdatei
* <params>
* <param name="" value=""/>
* </params>
* */
private String configFile = "";
/** Status Text */
private String stateText = "";
/** Name des Jobs, dessen Parameter aus der XML-Konfigurationsdatei extrahiert werden sollen.
* Gilt nur, wenn diese Klasse �ber die Kommandozeile aufgerufen wird*/
private String jobname = "";
/**
* Konstruktor
*
*/
public JobSchedulerLoadTestLauncher(SOSLogger sosLogger_) throws Exception {
try {
this.sosLogger = sosLogger_;
init();
} catch (Exception e) {
throw new Exception ("..error in " + SOSClassUtil.getMethodName() + ": " + e.getMessage());
}
}
/**
* Konstruktor
*
*/
public JobSchedulerLoadTestLauncher(SOSLogger sosLogger_, String configFile_, String jobname_, String host_, int port_) throws Exception {
try {
this.sosLogger = sosLogger_;
this.configFile = configFile_;
// Wenn das configFile_ mehrere Job-Definitionen enth�lt, dann sollen die Parameter diese jobname extrahiert werden
if (jobname_ != null && jobname_.length() > 0) {
this.jobname = jobname_;
sosLogger.debug3("..argument[job] = " + jobname);
}
init();
//Das Argument host_ �berschreibt eventuell vorhandene Parameter aus der Konfigurationsdatei
if (sosString.parseToString(host_).length() > 0) {
this.schedulerLauncherHost = host_;
sosLogger.debug3("..argument[host] = " + schedulerLauncherHost);
}
//Das Argument port_ �berschreibt eventuell vorhandene Parameter aus der Konfigurationsdatei
if ((port_ != -1)
&& (sosString.parseToString(String.valueOf(port_)).length() > 0)) {
this.schedulerLauncherPort = port_;
sosLogger.debug3("..argument[port] = " + schedulerLauncherPort);
}
} catch (Exception e) {
throw new Exception ("..error in " + SOSClassUtil.getMethodName() + ": " + e.getMessage());
}
}
private void init() throws Exception{
try {
sosString = new SOSString();
if (sosString.parseToString(jobname).length() > 0) {
extractParameters(jobname);
} else {
extractParameters();
}
} catch (Exception e) {
throw new Exception ("..error in " + SOSClassUtil.getMethodName() + ": " + e.getMessage());
}
}
/**
* Extrahiert die Parameters aus einer Konfigurationsdatei.
* Das ist der Fall, wenn diese Klasse �ber eine Kommandozeile aufgerufen wurde und
* die Konfigurationsdateiname als Argument �bergeben wurde.
*
* Wenn keine Konfigurationsdatei �bergeben wurde, dann springt er raus.
*
* @throws Exception
*/
private void extractParameters() throws Exception{
sosLogger.debug1("..reading parameters ...");
String paramName = "";
String paramValue = "";
try {
if (configFile.length() == 0)
return;
allParam= new HashMap(); //Hilfsvariaable
SOSXMLXPath xpath = new SOSXMLXPath(this.configFile);
org.w3c.dom.NodeList nl = xpath.selectNodeList(xpath.document.getElementsByTagName("param").item(0),"//param");
for(int i =0; i < nl.getLength(); i++) {
Node nParam = nl.item(i);
org.w3c.dom.NamedNodeMap map = nParam.getAttributes();
for (int j = 0; j < map.getLength(); j++) {
//sosLogger.debug6(".. attributes: " + map.item(j).getNodeName()+ "="+ map.item(j).getNodeValue());
paramName = map.item(j).getNodeValue();
if (map.getLength() > 1) {
j++;
//sosLogger.debug6(" ..parameter: " + map.item(j).getNodeName()+ "="+ map.item(j).getNodeValue());
paramValue = map.item(j).getNodeValue();
}
sosLogger.debug6(".. parameter: " + paramName+ "="+ paramValue);
allParam.put(paramName, paramValue);
}
}
getParameters();
} catch (Exception e) {
throw new Exception("..error occurred processing job parameters: " + e.getMessage());
}
}
/**
* Extrahiert die Parameters aus einer Konfigurationsdatei.
* Das ist der Fall, wenn diese Klasse �ber eine Kommandozeile aufgerufen wurde und
* die Konfigurationsdateiname als Argument �bergeben wurde.
*
* Wenn keine Konfigurationsdatei �bergeben wurde, dann springt er raus.
*
* @throws Exception
*/
private void extractParameters(String jobname) throws Exception{
String paramName = "";
String paramValue = "";
boolean existJob = false;
try {
if (configFile.length() == 0)
return;
allParam= new HashMap(); //Hilfsvariaable
SOSXMLXPath xpath = new SOSXMLXPath(this.configFile);
org.w3c.dom.NodeList nl = xpath.selectNodeList("//param");
for(int i =0; i < nl.getLength(); i++) {
Node nParam = nl.item(i);
if (nParam.getParentNode().getParentNode().getNodeName().equals("job") &&
nParam.getParentNode().getParentNode().getAttributes().getNamedItem("name").getNodeValue().equals(jobname)) {
existJob = true;
org.w3c.dom.NamedNodeMap map = nParam.getAttributes();
for (int j = 0; j < map.getLength(); j++) {
paramName = map.item(j).getNodeValue();
if (map.getLength() > 1) {
j++;
paramValue = map.item(j).getNodeValue();
}
sosLogger.debug6(".. attribute: " + paramName+ "="+ paramValue);
allParam.put(paramName, paramValue);
}
}
}
if (!existJob) {
throw new Exception("..job [" + jobname + "] not found in configuration file: " + configFile);
}
getParameters();
} catch (Exception e) {
throw new Exception("..error occurred processing job parameters: " + e.getMessage());
}
}
/**
* Setzen alle Parametern
* @param allParams_
* @throws Exception
*/
public void setParameters (HashMap allParams_) throws Exception{
try {
this.allParam = allParams_;
getParameters();
} catch (Exception e) {
throw new Exception("..error occurred processing job parameters: " + e.getMessage());
}
}
private void getParameters() throws Exception{
sosLogger.debug3("get parameters ...");
try {
if (sosString.parseToString(schedulerLauncherHost).length() == 0) {
if (sosString.parseToString(allParam, "scheduler_launcher_host").length() > 0) {
schedulerLauncherHost = sosString.parseToString(allParam, "scheduler_launcher_host");
sosLogger.debug3("..parameter[scheduler_launcher_host] = " + schedulerLauncherHost);
}
}
if (sosString.parseToString(allParam, "scheduler_launcher_port").length() > 0) {
schedulerLauncherPort = Integer.parseInt(sosString.parseToString(allParam, "scheduler_launcher_port"));
sosLogger.debug3("..parameter[scheduler_launcher_port] = " + schedulerLauncherPort);
}
if (sosString.parseToString(allParam, "scheduler_launcher_protocol").length() > 0) {
schedulerLauncherProtocol = sosString.parseToString(allParam, "scheduler_launcher_protocol");
sosLogger.debug3("..parameter[scheduler_launcher_protocol] = " + schedulerLauncherProtocol);
}
if (sosString.parseToString(allParam, "scheduler_launcher_min_starts").length() > 0) {
schedulerLauncherMinStarts = Integer.parseInt(sosString.parseToString(allParam, "scheduler_launcher_min_starts"));
sosLogger.debug3("..parameter[scheduler_launcher_min_starts] = " + schedulerLauncherMinStarts);
}
if (sosString.parseToString(allParam, "scheduler_launcher_start_increment").length() > 0) {
sosLogger.debug3("..parameter[scheduler_launcher_start_increment] = " + schedulerLauncherStartIncrement);
if (sosString.parseToString(allParam, "scheduler_launcher_start_increment").trim().startsWith("+") ||
sosString.parseToString(allParam, "scheduler_launcher_start_increment").trim().startsWith("*")) {
schedulerLauncherStartIncrement = Integer.parseInt(sosString.parseToString(allParam, "scheduler_launcher_start_increment").trim().substring(1));
schedulerLauncherStartIncrementFactor = sosString.parseToString(allParam, "scheduler_launcher_start_increment").trim().substring(0, 1);
} else {
schedulerLauncherStartIncrement = Integer.parseInt(sosString.parseToString(allParam, "scheduler_launcher_start_increment"));
}
}
if (sosString.parseToString(allParam, "scheduler_launcher_max_starts").length() > 0) {
this.schedulerLauncherMaxStarts= Integer.parseInt(sosString.parseToString(allParam, "scheduler_launcher_max_starts"));
sosLogger.debug3("..parameter[scheduler_launcher_max_starts] = " + schedulerLauncherMaxStarts);
}
if (sosString.parseToString(allParam, "scheduler_launcher_interval").length() > 0) {
schedulerLauncherInterval = Integer.parseInt(sosString.parseToString(allParam, "scheduler_launcher_interval"));
sosLogger.debug3("..parameter[scheduler_launcher_interval] = " + schedulerLauncherInterval);
}
if (sosString.parseToString(allParam, "scheduler_launcher_job").length() > 0) {
schedulerLauncherJob = sosString.parseToString(allParam, "scheduler_launcher_job");
sosLogger.debug3("..parameter[scheduler_launcher_job] = " + schedulerLauncherJob);
}
if (sosString.parseToString(allParam, "scheduler_launcher_job_after").length() > 0) {
schedulerLauncherJobAfter = sosString.parseToString(allParam, "scheduler_launcher_job_after");
sosLogger.debug3("..parameter[scheduler_launcher_job_after] = " + schedulerLauncherJobAfter);
}
if (sosString.parseToString(allParam, "scheduler_launcher_job_at").length() > 0) {
schedulerLauncherJobAt = sosString.parseToString(allParam, "scheduler_launcher_job_at");
sosLogger.debug3("..parameter[scheduler_launcher_job_at] = " + schedulerLauncherJobAt);
}
if (sosString.parseToString(allParam, "scheduler_launcher_duration").length() > 0) {
schedulerLauncherDuration = Long.parseLong(sosString.parseToString(allParam, "scheduler_launcher_duration"));
sosLogger.debug3("..parameter[scheduler_launcher_duration] = " + schedulerLauncherDuration);
}
if (sosString.parseToString(allParam, "scheduler_launcher_job_web_service").length() > 0) {
schedulerLauncherJobWebService = sosString.parseToString(allParam, "scheduler_launcher_job_web_service");
sosLogger.debug3("..parameter[scheduler_launcher_web_service] = " + schedulerLauncherJobWebService);
}
if (sosString.parseToString(allParam, "scheduler_launcher_order").length() > 0) {
schedulerLauncherOrder = sosString.parseToString(allParam, "scheduler_launcher_order");
sosLogger.debug3("..parameter[scheduler_launcher_order] = " + schedulerLauncherOrder);
}
if (sosString.parseToString(allParam, "scheduler_launcher_order_replace").length() > 0) {
schedulerLauncherOrderReplace = sosString.parseToBoolean(sosString.parseToString(allParam, "scheduler_launcher_order_replace"));
sosLogger.debug3("..parameter[scheduler_launcher_order_replace] = " + schedulerLauncherOrderReplace);
}
if (sosString.parseToString(allParam, "scheduler_launcher_order_job_chain").length() > 0) {
schedulerLauncherOrderJobChain = sosString.parseToString(allParam, "scheduler_launcher_order_job_chain");
sosLogger.debug3("..parameter[scheduler_launcher_order_job_chain] = " + schedulerLauncherOrderJobChain);
}
if (sosString.parseToString(allParam, "scheduler_launcher_order_state").length() > 0) {
schedulerLauncherOrderState = sosString.parseToString(allParam, "scheduler_launcher_order_state");
sosLogger.debug3("..parameter[scheduler_launcher_order_state] = " + schedulerLauncherOrderState);
}
if (sosString.parseToString(allParam, "scheduler_launcher_order_title").length() > 0) {
schedulerLauncherOrderTitle = sosString.parseToString(allParam, "scheduler_launcher_order_title");
sosLogger.debug3("..parameter[scheduler_launcher_title] = " + schedulerLauncherOrderTitle);
}
if (sosString.parseToString(allParam, "scheduler_launcher_order_at").length() > 0) {
schedulerLauncherOrderAt = sosString.parseToString(allParam, "scheduler_launcher_order_at");
sosLogger.debug3("..parameter[scheduler_launcher_order_at] = " + schedulerLauncherOrderAt);
}
if (sosString.parseToString(allParam, "scheduler_launcher_order_priority").length() > 0) {
schedulerLauncherOrderPriority = sosString.parseToString(allParam, "scheduler_launcher_order_priority");
sosLogger.debug3("..parameter[scheduler_launcher_order_priority] = " + schedulerLauncherOrderPriority);
}
if (sosString.parseToString(allParam, "scheduler_launcher_order_web_service").length() > 0) {
schedulerLauncherOrderWebService = sosString.parseToString(allParam, "scheduler_launcher_order_web_service");
sosLogger.debug3("..parameter[scheduler_launcher_order_web_service] = " + schedulerLauncherOrderWebService);
}
} catch (Exception e) {
throw new Exception("..error occurred processing job parameters: " + e.getMessage());
}
}
/**
* Erstellt das XML-String zusammen zu einem Request.
* @return
* @throws Exception
*/
private String getRequest() throws Exception {
String request = "";
try {
if (sosString.parseToString(schedulerLauncherOrder).length() > 0) {
request = "<add_order";
request += " replace=\"" + (this.schedulerLauncherOrderReplace ? "yes" : "no") + "\"";
if (sosString.parseToString(this.schedulerLauncherOrder).length() > 0)
request += " id=\"" + schedulerLauncherOrder + "\"";
if (sosString.parseToString(this.schedulerLauncherOrderAt).length() > 0)
request += " at=\"" + this.schedulerLauncherOrderAt + "\"";
else {
request += " at=\"now + " + this.schedulerLauncherInterval +"\"";
}
//will hier mit einer Varaiable arbeiten.
this.schedulerLauncherJobAt = schedulerLauncherOrderAt;
if (sosString.parseToString(this.schedulerLauncherOrderJobChain).length() > 0)
request += " job_chain=\"" + this.schedulerLauncherOrderJobChain + "\"";
if (sosString.parseToString(this.schedulerLauncherOrderPriority).length() > 0)
request += " priority=\"" + this.schedulerLauncherOrderPriority + "\"";
if (sosString.parseToString(this.schedulerLauncherOrderState).length() > 0)
request += " state=\"" + this.schedulerLauncherOrderState + "\"";
if (sosString.parseToString(this.schedulerLauncherOrderTitle).length() > 0)
request += " title=\"" + this.schedulerLauncherOrderTitle + "\"";
if (sosString.parseToString(this.schedulerLauncherOrderWebService).length() > 0)
request += " web_service=\"" + schedulerLauncherOrderWebService + "\"";
request += ">";
request += "<params>";
Object[] params = this.allParam.entrySet().toArray();
for(int i=0; i<params.length; i++) {
if (!sosString.parseToString(params[i]).startsWith("scheduler_launcher_")) {
request += "<param name=\"" + sosString.parseToString(params[i]).split("=")[0] + "\" value=\"" + sosString.parseToString(params[i]).split("=")[1] + "\"/>";
}
}
request += "</params>";
request += "</add_order>";
} else if (sosString.parseToString(this.schedulerLauncherJob).length() > 0) {
request = "<start_job job=\"" + schedulerLauncherJob + "\"";
if (sosString.parseToString(schedulerLauncherJobAfter).length() > 0)
request += " after=\"" + this.schedulerLauncherJobAfter + "\"";
if (sosString.parseToString(schedulerLauncherJobAt).length() > 0)
request += " at=\"" + schedulerLauncherJobAt + "\"";
else {
request += " at=\"now + " + this.schedulerLauncherInterval + "\"";
}
if (sosString.parseToString(this.schedulerLauncherJobWebService).length() > 0)
request += " web_service=\"" + schedulerLauncherJobWebService + "\"";
request += ">";
request += "<params>";
Object[] params = this.allParam.entrySet().toArray();
for(int i=0; i<params.length; i++) {
if (!sosString.parseToString(params[i]).startsWith("scheduler_launcher_")) {
request += "<param name=\"" + sosString.parseToString(params[i]).split("=")[0] + "\" value=\"" + sosString.parseToString(params[i]).split("=")[1] + "\"/>";
}
}
request += "</params>";
request += "</start_job>";
}
sosLogger.debug("request: " + request);
return request;
} catch (Exception e) {
throw new Exception("..error in "+ SOSClassUtil.getClassName() + ": " + e.getMessage());
}
}
/**
* In dieser Methode wird eine Verbindung zu der Scheduler aufgebaut und
* das Request wird an den Job bzw. Order gesendet.
*
* @throws Exception
*/
public void process() throws Exception {
String request = "";
String response = "";
int counter = 0;
int counterError = 0;
long timeInSec = 0;
SOSSchedulerCommand remoteCommand = null;
try {
timeInSec = System.currentTimeMillis();
checkParams();
request = getRequest();
remoteCommand = new SOSSchedulerCommand();
remoteCommand.setProtocol(this.schedulerLauncherProtocol);
remoteCommand.connect(this.schedulerLauncherHost, this.schedulerLauncherPort);
boolean loop = true;
terminateTimeInSec = System.currentTimeMillis() + (this.schedulerLauncherDuration * 1000);
sosLogger.debug("..time until termination: " + terminateTimeInSec);
//soll so lange wiederholt werden, bis aktuelle Zeit = terminateTimeInSec erreicht hat
while(loop) {
sosLogger.info("..sending request to job scheduler [" + this.schedulerLauncherHost + ":" + this.schedulerLauncherPort + "]: " + request);
if (System.currentTimeMillis() > this.terminateTimeInSec) {
//Abbruchbedingungen erreicht
sosLogger.debug("..time until termination: " + terminateTimeInSec);
loop = false;
break; //abbruchbedingung
}
//loop wird nur auf false gesetzt, wenn scheduler_launcher_duration erreicht wurde.
for (int i =0; i < schedulerLauncherMinStarts ; i++) {
remoteCommand.sendRequest(request);
counter++;
// hier die Fehlerhandhabung
if (this.schedulerLauncherProtocol.equalsIgnoreCase("tcp")) { // no response is returned for UDP messages
response = remoteCommand.getResponse();
SOSXMLXPath xpath = new SOSXMLXPath(new StringBuffer(response));
String errCode = xpath.selectSingleNodeValue("//ERROR/@code");
String errMessage = xpath.selectSingleNodeValue("//ERROR/@text");
sosLogger.info("..job scheduler response: " + response);
if ((errCode != null && errCode.length() > 0) || (errMessage != null && errMessage.length() > 0)) {
sosLogger.warn("..job scheduler response reports error message: " + errMessage + " [" + errCode + "]");
counterError++;
}
}
}
schedulerLauncherMinStarts = this.startIncrement(schedulerLauncherMinStarts);
}
sosLogger.info("..number of jobs launched: " + counter);
stateText = "..number of jobs launched: " + (counter) + "(error="+(counterError) + ";success="+(counter - counterError) +")";
showSummary(counter, counterError, timeInSec);
} catch (Exception e) {
stateText = "..number of jobs launched: " + (counter) + "(error=" + counterError + ";success="+(counter - counterError) +")" + e.getMessage();
sosLogger.info("..error in "+ SOSClassUtil.getClassName() + ": " + e.getMessage());
throw new Exception("..error in "+ SOSClassUtil.getClassName() + ": " + e.getMessage());
} finally {
if (remoteCommand != null) { try { remoteCommand.disconnect(); } catch (Exception x) {} } // gracefully ignore this error
}
}
/**
* �berpr�fungen:
* Die Parameter scheduler_launcher_job und scheduler_launcher_order d�rfen nicht gleichzeitig leer sein bzw. gleichzeitig angegeben sein
* @throws Exception
*/
private void checkParams() throws Exception {
int oneOfUs = 0;
try {
oneOfUs += (sosString.parseToString(schedulerLauncherJob).length() == 0) ? 0 : 1;
oneOfUs += (sosString.parseToString(this.schedulerLauncherOrder).length() == 0) ? 0 : 1;
if (oneOfUs == 0) {
throw new Exception("one of the parameters [scheduler_launcher_job, scheduler_launcher_order] must be specified");
} else if (oneOfUs > 1) {
throw new Exception("only one of the parameters [scheduler_launcher_job, scheduler_launcher_order] must be specified, " + oneOfUs + " were given");
}
} catch (Exception e) {
throw new Exception("..error in "+ SOSClassUtil.getClassName() + ": " + e.getMessage());
}
}
/**
* Incrementiert um den Factory
* @param i
* @return
* @throws Exception
*/
private int startIncrement(int i) throws Exception{
int retVal = 0;
try {
if (schedulerLauncherStartIncrementFactor.startsWith("*")) {
retVal = i * schedulerLauncherStartIncrement;
} else {
retVal = i + schedulerLauncherStartIncrement;
}
if (retVal > this.schedulerLauncherMaxStarts) {
retVal = schedulerLauncherMaxStarts;
sosLogger.debug4("..maximum number of jobs to be launched is reached: " + schedulerLauncherMaxStarts);
}
if (schedulerLauncherInterval > 0) {
sosLogger.debug3("..delay " + schedulerLauncherInterval + " sec.");
Thread.sleep(schedulerLauncherInterval * 1000);
}
sosLogger.debug5("..next start increment from " + i + " to " + retVal);
return retVal;
} catch (Exception e) {
throw new Exception("..error in "+ SOSClassUtil.getClassName() + ": " + e.getMessage());
}
}
/**
* Nach Programmausf�hrung k�nnen folgende Ausgaben erfolgen:
* ---------------------------------------------------------------
* ..number of job starts :
* ..number of jobs processed successfully :
* ..number of jobs processed with errors :
* ..time elapsed in seconds :
* ---------------------------------------------------------------
*/
public void showSummary(int counter, int counterError, long timeInSec) throws Exception {
try {
sosLogger.debug5("..end time in miliseconds: "+ System.currentTimeMillis());
sosLogger.info("---------------------------------------------------------------");
sosLogger.info("..number of job starts : "+ counter);
sosLogger.info("..number of jobs processed successfully : "+ (counter - counterError));
sosLogger.info("..number of jobs processed with errors : "+ counterError);
sosLogger.info("..time elapsed in seconds : "+ Math.round((System.currentTimeMillis() - timeInSec) / 1000)+ "s");
sosLogger.info("---------------------------------------------------------------");
} catch (Exception e) {
throw new Exception("..error occurred in "
+ SOSClassUtil.getMethodName() + ": " + e.getMessage());
}
}
/**
* Liefert den Status
* @return String
*/
public String getStateText() {
return stateText;
}
/**
*
* Diese Klasse kann �ber die Kommadozeile aufgerufen werden, z.B. kann die
* Kommando-Datei wie folgt aussehen:
*
* **********************************************************************************
* rem @echo off
* rem ---------------------------------------------------------------------------
* rem Start script for the sos.scheduler.launcher.JobSchedulerLoadTestLauncher
* rem ---------------------------------------------------------------------------
*
* set LIB_PATH=C:\scheduler.launcher
* set CLASS_PATH=.;%LIB_PATH%;%LIB_PATH%\lib\sos.mail.jar;%LIB_PATH%\lib\sos.util.jar;%LIB_PATH%\lib\sos.xml.jar;%LIB_PATH%\lib\xercesImpl.jar;%LIB_PATH%\lib\xml-apis.jar;%LIB_PATH%\lib\xalan.jar
*
* rem run the command
* java -cp "%CLASS_PATH%" sos.scheduler.launcher.JobSchedulerLoadTestLauncher -config=J:\E\java\mo\sos.scheduler.job\src\test_xmls\job.xml -host=localhost -port=4373 > launcher.log
*
* **********************************************************************************
*
* @param args
*/
public static void main(String[] args) {
String configFile = "";
String host = "";
int port = -1; //es wurde kein Argument -port= �bergeben
String job = "";
SOSString sosString = null;
try {
sosString = new SOSString();
if (args.length == 0) {
System.err.println("Usage: ");
System.out.println("sos.scheduler.launcher.JobSchedulerLoadTestLauncher");
System.out.println(" -config= xml configuration file");
System.out.println(" -host= host (optional)");
System.out.println(" -port= port (optional)");
System.out.println(" -job= job (optional)");
System.out.println();
System.out.println("for example:");
System.err.println("java -cp=. sos.scheduler.launcher.JobSchedulerLoadTestLauncher -config=<xml configuration file> -host=<host> -port=<port> -job=<job name>");
System.exit(0);
}
sos.util.SOSStandardLogger sosLogger = new sos.util.SOSStandardLogger(9);
JobSchedulerLoadTestLauncher launcher = null;
for (int i = 0; i < args.length; i++) {
String[] currArg = args[i].split("=");
if (currArg[0].equalsIgnoreCase("-config")) {
configFile = currArg[1];
} else if (currArg[0].equalsIgnoreCase("-host")) {
host = currArg[1];
} else if (currArg[0].equalsIgnoreCase("-port")) {
if (sosString.parseToString(currArg[1]).length() > 0) {
port = Integer.parseInt(currArg[1]);
}
} else if (currArg[0].equalsIgnoreCase("-job")) {
job = currArg[1];
}
}
launcher = new JobSchedulerLoadTestLauncher(sosLogger, configFile, job, host, port);
launcher.process();
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
}