Beispielsammlung, Leitfaden > Synchronisieren aktiver Aufgaben

Synchronisation von aktiven Aufgaben

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