Dies ist die alte 4D Dokumentations-Website. Die neue und aktualisierte Dokumentation finden Sie unter developer.4d.com |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v20 R7
Execute on server
|
Execute on server ( Methodenname ; Stapel {; Prozessname {; Param {; Param2 ; ... ; ParamN}}}{; *} ) -> Funktionsergebnis | ||||||||
Parameter | Typ | Beschreibung | ||||||
Methodenname | String |
![]() |
Zu startende Methode im Prozess | |||||
Stapel | Lange Ganzzahl |
![]() |
Größe des Stapelspeichers in Byte | |||||
Prozessname | String |
![]() |
Name des erzeugten Prozesses | |||||
Param | Ausdruck |
![]() |
Parameter für die Methode | |||||
* | Operator |
![]() |
Einmaliger Prozess | |||||
Funktionsergebnis | Lange Ganzzahl |
![]() |
Prozessnummer für neu erstellten oder bereits laufenden Prozess | |||||
Die Funktion Execute on server startet einen neuen Prozess auf dem Server-Rechner (aufgerufen im Client/Server-Betrieb) oder auf demselben Rechner (aufgerufen im Einzelbetrieb) und gibt die Prozessnummer für diesen Prozess zurück.
Mit dieser Funktion starten Sie eine Serverprozedur. Weitere Informationen dazu finden Sie im 4D Serverhandbuch im Abschnitt Serverprozeduren.
Rufen Sie Execute on server auf einem Client-Rechner auf, gibt der Befehl eine negative Prozessnummer zurück. Rufen Sie die Funktion auf dem Server-Rechner auf, gibt sie eine positive Prozessnummer zurück. Beachten Sie, dass Aufrufen von New process auf dem Server-Rechner dasselbe ausführt wie Aufrufen von Execute on server.
Konnte der Prozess nicht erstellt werden, z.B. weil der Speicher dafür nicht ausreicht, gibt Execute on server den Wert Null (0) zurück und es wird ein Fehler generiert. Sie können diesen Fehler mit ON ERR CALL in einer Fehlerverwaltungsmethode ausfindig machen.
Methodenname ist der Name der Methode, die im Prozess gestartet werden soll.
Nachdem 4D den Kontext für den neuen Prozess bestimmt hat, beginnt es mit der Ausführung dieser Methode. Sie wird zur Prozessmethode.
Im Parameter Stapel können Sie die Größe des Stapelspeichers angeben. Im Stapelspeicher werden Methodenaufrufe, lokale Variablen, Parameter in Unterroutinen und gestapelte Datensatze angehäuft.
Hinweis: Der Stapelspeicher ist NICHT der Gesamtspeicher des Prozesses. Prozesse teilen den Speicher auf für Datensätze, Interprozessvariablen usw., Prozessvariablen werden in einem Extraspeicher abgelegt. Der Stapelspeicher hält nur lokale Variablen, Methodenaufrufe, Parameter in Unterroutinen und gestapelte Datensätze.
Hinweis für 64-bit 4D Server: Der Stapelspeicher für einen Prozess, der auf einem 64-bit 4D Server ausgeführt wird, benötigt mehr Speicher als ein 32-bit 4D Server (in etwa doppelt soviel). In Einklang mit den oben angegebenen Schätzungen emfehlen wir im Normalfall mindestens 128.000 Bytes, und 400.000 Bytes zum Verwalten einer anpassbaren Aufrufkette. Denken Sie daran, diesen Parameter zu prüfen, wenn Ihr Code zum Ausführen auf einem 64-bit Server dienen soll.
Sie übergeben den Namen des neuen Prozesses in Prozessname. Im Einzelplatz erscheint dieser Name in der Liste der Prozesse des Runtime Explorer. Er wird vom Befehl _o_PROCESS PROPERTIES zurückgegeben, wenn er auf diesen neuen Prozess angewendet wird. Im Client/Server-Betrieb erscheint dieser Name im Hauptfenster von 4D Server in der Liste Serverprozeduren in Blau.
Geben Sie diesen Parameter nicht an, ist Prozessname ein leerer String.
Warnung: Machen Sie im Gegensatz zu New process mit der Funktion Execute on server den Prozess NICHT durch das vorangestellte Dollarzeichen lokal. Das funktioniert nur im Einzelplatzbetrieb, da Execute on server hier als New process agiert. Im Client/Server-Betrieb ruft das einen Fehler hervor.
Sie können für die Prozessmethode Parameter übergeben, und zwar genauso wie für eine Unterroutine. Lediglich Ausdrücke vom Typ Zeiger und Arrays können Sie nicht übergeben. Sobald die Ausführung im Kontext des neuen Prozesses startet, erhält die Prozessmethode die Parameterwerte in $1, $2, etc.
Hinweis: Übergeben Sie Parameter in der Prozessmethode, müssen Sie auch Prozessname übergeben. In diesem Fall können Sie ihn nicht weglassen.
Übergeben Sie als Parameter ein 4D Objekt (_O_C_OBJECT) oder eine Collection (_O_C_COLLECTION), wird eine Kopie (keine Referenz) gesendet und das JSON Formular in UTF-8 für den Server verwendet. Enthält das Objekt oder die Collection Zeiger, werden die dereferenzierten Werte und nicht die Zeiger selbst gesendet.
Geben Sie diesen Parameter an, erhält 4D die Anweisung, zuerst zu prüfen, ob bereits ein Prozess Prozessname vorhanden ist. Ist dies der Fall, startet 4D keinen neuen Prozess und gibt die Prozessnummer des Prozesses Prozessname zurück.
Einige Angaben des remote Rechners in einer Textdatei auf dem Server Rechner protokollieren.
Sie führen die Methode mit lokaler Information als Parameter auf einem remote Rechner aus:
$process:=Execute on server("WriteLog";0;"WriteLogFile";Current user;String(Current date);String(Current time))
Die Methode WriteLog wird auf dem Server ausgeführt. Sie kann beispielsweise lauten:
C_TEXT($1;$2;$3)
TEXT TO DOCUMENT(Get 4D folder(Logs folder)+"Log"+$1+".txt";$2+" "+$3)
Folgendes Beispiel zeigt, wie Sie den Datenimport im Client/Server-Betrieb entscheidend beschleunigen können. Mit der nachfolgenden Methode Regular Import können Sie prüfen, wie lange der Import von Datensätzen mit dem Befehl IMPORT TEXT auf der Arbeitsstation dauert:
` Projektmethode Regular Import
$vhDocRef:=Open document("")
If(OK=1)
CLOSE DOCUMENT($vhDocRef)
FORM SET INPUT([Table1];"Import")
$vhStartTime:=Current time
IMPORT TEXT([Table1];Document)
$vhEndTime:=Current time
ALERT("Es dauerte "+String(0+($vhEndTime-$vhStartTime))+" Sekunden.")
End if
Bei regulären Importdaten zeigt 4D Client das Durchlaufen der Textdatei an, und erstellt dann für jeden Datensatz einen neuen Datensatz, füllt die Felder mit den importierten Daten und sendet den Datensatz an den Server-Rechner, damit er der Datenbank hinzugefügt wird. Auf diese Weise gehen viele Anfragen über das Netz. Diese Operation können Sie über eine Serverprozedur optimieren, die den Vorgang lokal auf dem Server-Rechner ausführt. Der Client-Rechner lädt das Dokument in ein BLOB, übergibt das BLOB als Parameter und startet so eine Serverprozedur. Die Serverprozedur speichert das BLOB in ein Dokument auf der Festplatte des Server-Rechners und importiert das Dokument dann lokal. Der Datenimport wird mit der Geschwindigkeit einer Einzelplatz-Version ausgeführt, da die meisten Anfragen über das Netz eliminiert wurden.
Hier ist die Projektmethode CLIENT IMPORT. Sie wird auf dem Client-Rechner ausgeführt und startet die nachfolgende Serverprozedur SERVER IMPORT:
` Projektmethode CLIENT IMPORT
` CLIENT IMPORT ( Pointer ; String )
` CLIENT IMPORT ( -> [Table] ; Input form )
C_POINTER($1)
C_TEXT(31;$2)
C_TIME($vhDocRef)
C_BLOB($vxData)
C_LONGINT(spErrCode)
`Wähle das zu importierende Dokument
$vhDocRef:=Open document("")
If(OK=1)
` Wurde ein Dokument ausgewählt, lasse es nicht offen
CLOSE DOCUMENT($vhDocRef)
$vhStartTime:=Current time
` Versuche, es in den Speicher zu laden
DOCUMENT TO BLOB(Document;$vxData)
If(OK=1)
` Das Dokument konnte ins BLOB geladen werden, Starte Serverprozedur, die Daten auf dem Server-Rechner importiert
$spProcessID:=Execute on server("SERVER IMPORT";0;"Server Import Services";Table($1);$2;$vxData)
` Wir benötigen das BLOB nicht länger in diesem Prozess
CLEAR VARIABLE($vxData)
` Warte bis von Serverprozedur ausgeführte Operation fertig ist.
Repeat
DELAY PROCESS(Current process;300)
GET PROCESS VARIABLE($spProcessID;spErrCode;spErrCode)
If(Undefined(spErrCode))
` <strong>Hinweis:</strong> Wurde die Serverprozedur nicht mit der eigenen Instanz der Variablen spErrCode initialisiert, wird evtl. eine undefinierte Variable zurückgegeben
spErrCode:=1
End if
Until(spErrCode<=0)
` Teile der Serverprozedur mit, dass wir bestätigen
spErrCode:=1
SET PROCESS VARIABLE($spProcessID;spErrCode;spErrCode)
$vhEndTime:=Current time
ALERT("Es dauerte "+String(0+($vhEndTime-$vhStartTime))+" Sekunden.")
Else
ALERT("Der Speicher reicht nicht aus zum Laden des Dokuments.")
End if
End if
Die Projektmethode SERVER IMPORT ausgeführt als Serverprozedur:
` SERVER IMPORT Project Method
` SERVER IMPORT ( Long ; String ; BLOB )
` SERVER IMPORT ( Tabellennummer ; Eingabeformular ; Importdaten )
C_LONGINT($1)
C_TEXT(31;$2)
C_BLOB($3)
C_LONGINT(spErrCode)
` Operation ist noch nicht beendet, setze spErrCode auf 1
spErrCode:=1
$vpTable:=Table($1)
INPUT FORM($vpTable->;$2)
$vsDocName:="Import File "+String(1+Random)
DELETE DOCUMENT($vsDocName)
BLOB TO DOCUMENT($vsDocName;$3)
IMPORT TEXT($vpTable->;$vsDocName)
DELETE DOCUMENT($vsDocName)
` Operation ist beendet, setze spErrCode auf 0
spErrCode:=0
` Warte bis der anfragende Client das Ergebnis erhalten hat
Repeat
DELAY PROCESS(Current process;1)
Until(spErrCode>0)
Mit diesen beiden Projektmethoden in einer Datenbank können Sie einen Datenimport über eine Serverprozedur ausführen. Schreiben Sie z.B.:
CLIENT IMPORT(->[Table1];"Import")
Mit einigen Benchmarks werden Sie entdecken, dass Sie mit dieser Methode Datensätze bis zu 60 Mal schneller importieren können als über regulären Import.
Siehe Abschnitt Service mit Serverprozeduren (Beispiel) im 4D Server Handbuch.
Produkt: 4D
Thema: Prozesse
Nummer:
373
Geändert: 4D 2004.3
Geändert: 4D v16 R4
4D Programmiersprache ( 4D v20 R7)