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
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
...
}