Ziel: Aufgaben, die bereits aktiv sind, sollen nachträglich manuell synchronisiert werden.
Verwendete Objekte: Script und Sync
Verwendete Script-Sprachmittel: ADD, :ATTACH_SYNC, :BEGINREAD, FORMAT, GET_SYNC, GET_UC_OBJECT_NR, :PRINT, :READ, SET_SYNC und :STOP
Sync-Objekte dienen der Synchronisation von Aufgaben. Jedes ausführbare Objekt enthält eine Sync-Registerkarte, in der die erforderlichen Aktionen ausgewählt werden können. Es ist zusätzlich auch möglich bereits aktive Aufgaben nachträglich zu synchronisieren.
Sync
In einem Sync-Objekt werden Zustände definiert (z.B. "EXCLUSIV - Die Datenbank ist exklusiv belegt"), deren Bezeichnung und Anzahl Sie selbst bestimmen können. Das Sync-Objekt nimmt einen dieser Zustände an und wechselt ihn sobald Aktionen eintreten. Diese Aktionen werden ebenfalls im Sync-Objekt definiert und sind daraufhin in Objekten auswählbar.
In jedem ausführbaren Objekt können Sie zunächst das Sync-Objekt aussuchen und dann die Aktionen mit deren Ausführungszeitpunkten setzen (z.B. Aktion - "RELEASE" bei Beendigung der Aufgabe). Aufgrund des jeweils aktuellen Zustandes und der Reaktion darauf wird eine Synchronisation von Aufgaben ermöglicht.
Dieses Beispiel zeigt, wie man zwei Aufgaben synchronisiert, indem man eine Aufgabe als Nachfolger der anderen festlegt. Der Ablauf sieht folgendermaßen aus:
Sync-Objekt frei? -> 1. Aufgabe wird durchgeführt -> 2. Aufgabe wird durchgeführt
Daraus lassen sich die Zustände "FREI", "AUFGABE1" und "AUFGABE2" für das Sync-Objekt ableiten. Es werden auch drei Aktionen benötigt, um die Sync-Zustände steuern zu können: "SET_AUFGABE1", "SET_AUFGABE2" und "SET_FREI".
Das Zusammenspiel vom Sync-Objekt und den Aufgaben ist in der folgenden Tabelle dargestellt:
Voraussetzung: Sync-Objekt ist im Zustand "FREI". |
||
---|---|---|
Definition in... |
Aktion |
Ergebnis |
SET_SYNC (im Script) |
SET_AUFGABE1 |
Aufgabe1 kann starten |
1. Aufgabe |
SET_AUFGABE2 (beim Ende) |
Aufgabe2 kann starten |
2. Aufgabe |
SET_FREI (beim Start) |
Sync-Objekt ist wieder frei |
Mit diesen Einstellungen können pro Sync-Objekt zwei Aufgaben synchronisiert werden. In diesem Beispiel werden zwei Sync-Objeke verwendet und sind ausreichend. Die manuelle Synchonisierung wird nur in Ausnahmefällen eingesetzt, zum Beispiel wenn eine zusätzliche Aufgabe in einen bestehenden Ablauf eingefügt werden muss. Als Objektname ist eine fixe Bezeichnung plus einer Zahl sinnvoll, da Sie mit einem Zähler die einzelnen Sync-Objekte ansprechen können.
Script
Da die nachträgliche Synchronisation der beiden Aufgaben mit Script-Sprachmitteln durchgeführt werden kann, ist ein Script-Objekt anzulegen, welches die erforderliche Prozedur beinhaltet.
Zuerst wird ein Eingabedialog erzeugt, der die beiden Aufgabennamen aufnimmt. Anschließend muss kontrolliert werden, ob diese Aufgaben wirklich aktiv sind (d.h. eine RunID besitzen). Ansonsten wird das Script abgebrochen.
Danach überprüft eine WHILE-Schleife, ob freie SYNC-Objekte vorhanden sind. Anhand einer Zählervariable werden die Namen der Reihe nach durchgegangen (SYNC.JOB.ABHAENGIGKEIT_nn).
Mit der Script-Funktion GET_SYNC ist der aktuelle Zustand des Sync-Objektes auslesbar, der "FREI" sein muss, damit es die Aufgaben verwenden können. Wird kein Sync-Objekt gefunden bricht das Script ab. Ist ein freies Sync-Objekt verfügbar, kann es in den beiden Aufgaben mit dem Sprachmittel ATTACH_SYNC eingetragen werden.
!Number of available SYNC objects
:SET &number_sync# = 2
!Specifying the task and its successor
:BEGINREAD 'Defining a dynamic dependency'
: PRINT 'ATTENTION: The tasks must
already be active !!!'
: PRINT ''
: READ &task1#,'00','Name of the predecessor',,M
: READ &task2#,'00','Name of the successor',,M
:ENDREAD
!Is the task active?
:SET &RunIDa1# = GET_UC_OBJECT_NR(JOBS,'&task1#')
:IF &RunIDa1# = ''
: STOP MSG,50,'Predecessor (&task1#)
is not active!'
:ENDIF
!Is task 2 active?
:SET &RunIDa2# = GET_UC_OBJECT_NR(JOBS,'&task2#')
:IF &RunIDa2# = ''
: STOP MSG,50,'successor (&task2#)
is not active!'
:ENDIF
Retrieving a free SYNC object through a counter
!(SYNC.JOB.DEPENDENCY_01, SYNC.JOB.DEPENDENCY_02)
:SET &status# = ''
:SET &counter# = 0
:WHILE &status# <> 'FREE'
: SET &counter# = ADD(&counter#,1)
: SET &counter# = FORMAT(&counter#,'00')
: IF &counter# > &number_sync#
: STOP MSG,50,'No free Sync object
available!'
: ENDIF
: SET &status# = GET_SYNC('SYNC.JOB.DEPENDENCY_&counter#','STATE')
:ENDWHILE
!Adding the SYNCs
:SET &ret# = SET_SYNC('SYNC.JOB.DEPENDENCY_&counter#','SET_TASK1')
:ATTACH_SYNC
JOBS,&RunIDa1#,'SYNC.JOB.DEPENDENCY_&counter#',,,SET_TASK2,W
:ATTACH_SYNC
JOBS,&RunIDa2#,'SYNC.JOB.DEPENDENCY_&counter#',SET_FREE,,,W
Automic Documentation - Tutorials - Automic Blog - Resources - Training & Services - Automic YouTube Channel - Download Center - Support |
Copyright © 2016 Automic Software GmbH |