Table of Contents

ScheduledTask

Informationen

  • Kategorien: Kernel | ScheduledTask
  • Version: 19.0.0.8131
  • Veröffentlichungsdatum: Dienstag, 1. März 2016
  • Entwickler: Schulze
  • Benötigt Datenbankänderung: Nein
  • Betreff: Geplante Aufgaben

Beschreibung

Die KF-Funktion "ScheduleTask" wurde so erweitert dass diese auch im IS-Service ausgeführt werden kann. Voraussetzung ist dass eine gültige Lizenz dafür vorhanden ist.

Um den TaskScheduler im IS-Service freizuschalten muss in der service.ini folgender Eintrag stehen: [HOSTING] TaskScheduler=TRUE

Beim Starten des IS-Service hat das zur Folge dass der IS-Service eine Lizenz mit der FeatureID=10 (TaskSchedule) belegt. Der Status der Lizenzbelegung wird in die Ereignisanzeige geschrieben. Wenn die Lizenz erfolgreich belegt werden konnte startet im Kern der TaskScheduler.

Mit dem Aufruf der KF-Funktion "ScheduleTask" kann nun, analog wie im FAT-Client, eine festgelegte (Task-)Funktion in einem festgelegten Intervall aufgerufen werden.

Für die Mandantenumschaltung im IS-Service wurden außerdem folgende NI-Funktionen in die ClassformFctNI eingebaut:

  • NI_SetActiveClientgroup
  • NI_SetAllAccessibleClientsActive
  • NI_SetAllWriteableClientsActive
  • NI_SetActiveClient

Zusätzlich gibt es noch ein neues Event:

  • OnEvent_ErrorLog dieses wird aufgerufen wenn bei Ausführung einer vom TaskScheduler initiierten Funktion ein Fehler im Kern auftritt.

Weiterhin wurde eine neue Funktion "ExecuteSessionTask" implementiert. Mit dieser KF-Funktion kann man die Task-Funktion in einer neuen Session ausführen. Jede Session belegt jeweils eine IS-Session-Lizenz (Feature-ID=8). Da die Sessions in jeweils einem eigenen Thread ausgeführt werden können so bei Bedarf mehrere Task-Funktionen unabhängig voneinander parallel ausgeführt werden. Nach Ausführen der Task-Funktion wird die jeweilige Session wieder geschlossen und die belegte Lizenz wieder frei gegeben. Um das Starten und Beenden der TaskFunktion überwachen zu können wurde außerdem das Event "OnEvent_SessionTask" implementiert. Dieses wird vor und nach Ausführung der Task-Funktion aufgerufen. Das Event wird in der Hauptsession ausgeführt.

Bilder

ScheduledTask

Beispielcode

// *********************************************
// Klassenformel "TaskFunc"
//
void onstartupevent( int $nPhase )
{
	// Den TaskScheduler nur einmal in der Hauptsession starten
	if ( !CausedBySessionInterfaceCumulated() && $nPhase == 8 )
	{
		// Der TaskScheduler startet im IS-Service nur wenn beim Starten 
		// eine TaskSchedule-Lizenz (FeatureID=10) belegt werden konnte (siehe Ereignisanzeige).
		// Aufruf z.B. alle 1 Minute, sofort starten, kein Ende
		ScheduleTask( "TaskFunc", NULL, NULL, 1 );
	}	
}

// Die Task-Funktion
oncallfunction
{
	// Hinweise: 
	// Als erstes sollte der Mandant in welchem gearbeitet werden soll festgelegt werden.
	// Beim Verlassen dieser Funktion müssen alle Änderungen gespeichert sein,
	// sonst ruft der TaskScheduler die Funktion nicht mehr auf (da die Session sich im Status "dirty" befindet)!

	// ToDo: Geplante Aufgabe hier ausführen
	...

	// Alternativ: Aufgabenausführung in eine separate (Neben-)Session verlagern:
	// Hinweis: ExecuteSessionTask belegt eine Session-Lizenz (FeatureID=8)!
	var int $nTaskId;
	$nTaskId = 1;
	ExecuteSessionTask( $nTaskId, "SessionTaskFunc", "admin", "" );
}

// Das Task-Fehler-Ereignis
void onEvent_ErrorLog( string $sMessage, int $nType )
{
	// ToDo: Fehlerbehandlung
	...
}


// *********************************************
// Klassenformel "SessionTaskFunc"
//
safe function int SessionTaskFunc( )
{
	// Hinweise: 
	// Wir sind hier in einer separaten Nebensession und haben keinen Zugriff auf Objekte der Hauptsession!
	// Zum Debuggen der Funktion kann man den FAT-CLient im "ServiceTestMode" starten 
	// (verfügbar ab Developer Revision 8270). 

	// ToDo: Geplante Aufgabe ausführen
	...
	
	// Der Rückgabewert kann in onEvent_SessionTask ausgewertet werden
	return 815;
}

// Das SessionTask-Ereignis
void onEvent_SessionTask( int $nCustomTaskId, time $EventTime, int $nEventType, int $vResult, string $sMessage )
{
	// Hinweise: 
	// Wir sind hier in der Hauptsession, das ist dieselbe in welcher der TaskScheduler gestartet wurde.
	// Der Parameter $nCustomTaskId wird in ExecuteSessionTask angegeben und kann hier ausgewertet werden.

	// ToDo: Log
	...
}