Bedingungen
Bei der Definition von Abläufen und zum Filtern von Ablaufobjekten im Monitoring kommen an verschiedenen Stellen Bedingungen zum Einsatz. So kann zum Beispiel für den automatischen Neustart, das Aktivieren und Deaktivieren von Kindern, die Gültigkeit von Abhängigkeiten und bei Triggern jeweils optional eine Bedingung hinterlegt werden.
Zum Beispiel kann mit einer zusätzlichen Bedingung spezifiziert werden, ob ein Trigger feuern soll oder nicht. Diese Bedingung ist ein boolescher Ausdruck und das Feuern findet statt, wenn diese Bedingung "true" ergibt.
Boolesche Operatoren
Da eine Bedingung ein boolescher Ausdruck ist, können boolesche Operatoren benutzt werden, um komplexe Bedingungen zu erstellen. Diese booleschen Operatoren sind:
- not (unärer Negations Operator)
- and
- or
Dabei gelten die üblichen Priotitätsregeln. Der Operator "not" hat Vorrang vor dem Operator "and", welcher wiederum Vorrang vor dem Operator "or" hat. Es ist erlaubt, Klammern zu benutzen, um eine Auswertungsreihenfolge zu erzwingen.
Ferner ist es erlaubt, die boolesche Konstanten "false" und "true" zu benutzen.
Vergleichs Operatoren
Vergleiche können als Teil von booleschen Ausdrücken benutzt werden. Folgende Vergleichs Operatoren werden definiert:
| Operator | Bedeutung |
|---|---|
| == | Gleich |
| >= | Größer oder Gleich |
| <= | Kleiner oder Gleich |
| != | Ungleich |
| > | Größer als |
| < | Kleiner als |
| =∼ | Pattern matches |
| !∼ | Pattern matches nicht |
Alle Vergleichs Operatoren können mit Zeichenketten arbeiten. Die Operatoren "größer" und "kleiner" benutzen im Fall von Zeichenketten den ascii-Wert der Zeichen. Die matching-Operatoren arbeiten nicht mit Zahlen. (Für eine vollständige Beschreibung der regulären Ausdrücke, welche von den match-Operatoren benutzt werden können, verweisen wir auf die originale Java Dokumentation der java.util.regexp.)
Numerische Operatoren
In Bedingungen können auch Ausdrücke verwendet werden, welche Werte als Ergebnis für obige Vergleichs-Operationen liefern können. In solchen Ausdrücken werden folgende (numerischen) Operationen unterstützt:
| Operator | Bedeutung |
|---|---|
| + | Unärer Operator |
| - | Unärer Negations Operator |
| * | Multiplikations Operator |
| / | Divisions Operator |
| % | Modulo Operator |
| + | Binärer Additions Operator |
| - | Binärer Subtraktions Operator |
Literale und Variablen
Literale sind Zahlen (ganze Zahlen und Fließkomma-Zahlen) oder Zeichenketten. Zeichenketten werden durch doppelte Anführungsstriche (") abgegrenzt. Es ist möglich, Variablen zu benutzen, welche innerhalb des Kontext des triggernden Objektes (z.B. Ausführungsobjekte oder Ressource) aufgelöst werden. Variablen werden adressiert, indem man ihrem Namen ein Dollarzeichen ($) voranstellt. Ist die Variable in eine Zeichenkette eingebettet, sodass das Ende des Parameter-Namens nicht eindeutig erkennbar ist, so kann der Parameter-Name in geschweiften Klammern gesetzt werden (${<parametername>}).
Bei der Auflösung der Variablen wird zuerst angenommen, dass es sich um eine Triggervariable handelt. Trifft dies nicht zu, wird die Variable als Jobvariable interpretiert. Diese Art der Auflösung ist zwar häufig richtig, aber leider nicht immer. Durch das Voranstellen von "job.", "trigger." oder "resource.", sowie im Kontext von Abhängigkeiten "dependent." und "required.", kann explizit angegeben werden, bei welchem Objekt nach der Variablen gesucht werden soll.
Normalerweise werden Variablen in Großbuchstaben angelegt. Dies kann durch Quoting der Namen verhindert werden. Allerdings wird beim Ansprechen der Variablen in Bedingungen der Name wieder in Großbuchstaben konvertiert. Um dies zu verhindern, muss der Name sowie ein eventuelles Präfix in geschweiften Klammern geschrieben werden.
Abhängig von dem Operator und dem ersten Operand, werden die Operanden als Zeichenketten oder Zahlen interpretiert. Multiplikationen, Divisionen, Modulo und Subtraktionen sowie die unären Abläufe sind nur für numerische Werte definiert. Der Additions-Operator in einem Zeichenketten-Kontext bewirkt das Aneinanderreihen der Operanden.
Funktionen
Weil nicht alles mittels (numerischer) Ausdrücke ausgedrückt werden kann, wurden einige Funktionen ergänzt. Zur Zeit sind folgende Funktionen definiert:
| Funktion | Bedeutung |
|---|---|
| abs(expression) | Der absolute Wert des Ausdrucks wird zurückgegeben |
| int(expression) | Der ganzzahlige Wert des Ausdrucks wird zurückgegeben |
| lowercase(expression) | Das Ergebnis des Ausdrucks wird in Kleinbuchstaben umgewandelt und zurückgegeben |
| round(expression) | Der Ausdruck wird gerundet und zurückgegeben |
| str(expression) | Der Ausdruck wird als Zeichenkette zurückgegeben |
| substr(source, from [ , until ]) | Gibt einen Teil der Zeichenkette "source", beginnend in der Position "from" bis zum Ende der Zeichenkette, oder wenn "until" spezifiziert ist, bis zur Position "until" zurück |
| trim(expression) | Der Ausdruck wird ohne Leerzeichen am Schluß zurückgegeben |
| uppercase(expression) | Das Ergebnis des Ausdrucks wird in Großbuchstaben umgewandelt und zurückgegeben |
Funktionen können ohne Einschränkung ineinander verschachtelt werden.
Beispiele
Zur Verdeutlichung folgen jetzt einige Statements die Bedingungen spezifizieren. Da Bedingungen nicht ausschließlich in der Definition von Triggern vorkommen, gibt es auch andere Beispiele. Die Syntax ist jedoch immer die selbe.
Beispiel 1
In diesem Beispiel wird ein Trigger ausgelöst, wenn der Job auf WARNING oder FAILURE geht, aber schon Zeilen verarbeitet hat ($NUM_ROWS > 0$).
CREATE OR ALTER TRIGGER ON_FAILURE
ON JOB DEFINITION SYSTEM.EXAMPLES.E0100_TRIGGER.TRIGGER
WITH
STATES = (FAILURE, WARNING),
SUBMIT SYSTEM.EXAMPLES.E0100_TRIGGER.ON_FAILURE,
IMMEDIATE MERGE,
ACTIVE,
NOMASTER,
SUBMITCOUNT = 3,
NOWARN,
NOSUSPEND,
CONDITION = '$NUM_ROWS > 0';
Beispiel 2
Dieses Environment fordert, dass der Wert der Ressourcen-Variable AVAILABLE mit einem T anfangen soll (wie etwa TRUE, True, true oder Tricky).
CREATE ENVIRONMENT SERVER@LOCALHOST
WITH
RESOURCE = (
RESOURCE.EXAMPLES.STATIC.NODE.LOCALHOST
CONDITION = '$RESOURCE.AVAILABLE =~ "[tT].*"',
RESOURCE.EXAMPLES.STATIC.USER.SERVER
);
Beispiel 3
Dieses Beispiel entspricht dem Beispiel 2, nur ist der Parametername in mixed case definiert.
CREATE ENVIRONMENT SERVER@LOCALHOST
WITH
RESOURCE = (
RESOURCE.EXAMPLES.STATIC.NODE.LOCALHOST
CONDITION = '${RESOURCE.Available} =~ "[tT].*"',
RESOURCE.EXAMPLES.STATIC.USER.SERVER
);`