Table of Contents

IS-Service als TaskScheduler

Informationen

  • Kategorien: Kernel
  • Version: 19.0.0.7770
  • Veröffentlichungsdatum: Montag, 26. Oktober 2015
  • Entwickler: Schulze
  • Benötigt Datenbankänderung: Nein
  • Betreff: IS-Service als TaskScheduler

Beschreibung

Der TaskScheduler-Timer ist jetzt auch im IS-Service freigeschaltet.

Folgende Voraussetzungen sind notwendig:

  • Freischaltung der Extra-Lizenz "FM-Task" (Feature-ID=10)
  • Einschalten des TaskScheduler-Hostings für den Dienst in der service.ini [HOSTING] TaskScheduler=TRUE

Damit kann die Klassenformel-Funktion "ScheduleTask" jetzt auch im IS-Service verwendet werden, bei Lizenz- und Hosting-Freischaltung startet sie den dahinterliegenden Timer.

Somit können Klassenformeln in periodischen Intervallen in der Hauptsession des IS-Service ausgeführt werden.

Außerdem wurden 2 neue Klassenformel-Funktionen eingebaut:

  • ExecuteSessionTask diese Funktion öffnet eine neue IS-Session in einem eigenständigem Thread und führt darin eine angegebene Funktion aus; damit ist es möglich mehrere Tasks parallel auszuführen -> pro Session wird eine IS-Session-Lizenz belegt

  • EventLogWriteEntry schreibt eine Meldung in das Anwendungsprotokoll der Ereignisanzeige; damit kann die Ausführung der Tasks überwacht werden

Ergänzend gibt es auch ein neues Event:

  • OnEvent_SessionTask dieses Ereignis wird vom Kern vor und nach Aufruf der in ExecuteSessionTask angegebenen Funktion in der Hauptsession ausgelöst; damit kann letztendlich Ausführung der Tasks überwacht werden

Hintergrund dieser Funktionalitäten ist dass zukünftig der IS-Service als Ersatz für geplante Tasks benutzt werden soll.

Mit Einsatz des IS-Service werden folgende Nachteile der geplanten Tasks umgangen:

  • Start des FAT-Client im UI-Modus
  • Belegung einer FM-Lizenz pro Task

Hinweise: Die Funktion "ExecuteSessionTask" führt eine Funktion in einer neuen Nebensession aus. Man kann sich eine Session so vorstellen als ob ein neuer FAT-Client gestartet wurde, nur dass die Nebensession keine Bedienoberfläche hat und im selben Prozess läuft wie die beim Programmstart erzeugte Hauptsession. In der Nebensession können Daten eingelesen und evtl. geändert werden. Wichtig ist zu beachten das Datenänderungen, welche in dieser Nebensession ausgeführt werden, nicht automatisch in der Hauptsession erkannt werden. Dafür müssen die Objekte neu aus der Datenbank eingelesen werden, dies geschieht durch Aufruf der Funktion "Rollback". In der Hauptsession laufen mit ScheduleTask gestartete Funktion, und das Ereignis OnEvent_SessionTask.

Bilder

IS-Service als TaskScheduler

Beispielcode

// Funktion OnStartup
//
void onstartupevent( int $nPhase )
{
	if ( $nPhase == 8 )
	{
		ScheduleTask( "TimerProc", AddHours( Now(), 1 ), Null, 60 );
	}
}

// Funktion TimerProc
//
oncallfunction
{
	ExecuteSessionTask( 815, "TaskProc", "admin", "", 1234, "test" );
}

// Funktion TaskProc
//
safe function int TaskProc( int $i, string $s )
{
	// Etwas tun...

	return 4321;
}

// Ereignis onEvent_SessionTask
//
void onEvent_SessionTask( int $nCustomTaskId, time $EventTime, int $nEventType, int $nResult, string $sMessage )
{
	var string $sFile;
	var string $sMsg;
	var int $nEvtLogEntry;

	$sFile = GetPath( #System.File.Area.User, #System.File.Section.Log, "ScheduleTask", "log", #System.File.Mode.Write | #System.File.Mode.Create ); 
	$sMsg = StrFormat( "{0} Event SessionTask is called, type={1}, result={2} message={3}\n", Now(), $nEventType, $nResult, $sMessage );
	WriteTextFile( $sMsg, $sFile, 1 );

	switch ( $nEventType )
	{
		case -1: $nEvtLogEntry = 1; break;
		default: $nEvtLogEntry = 4;
	}

	EventLogWriteEntry( $sMsg, $nEvtLogEntry );
}