4D v16.3

Execute on server

Home

 
4D v16.3
Execute on server

Execute on server 


 

Execute on server ( Methodenname ; Stapel {; Auswahlname {; Param {; Param2 ; ... ; ParamN}}}{; *} ) -> Funktionsergebnis 
Parameter Typ   Beschreibung
Methodenname  String in Zu startende Methode im Prozess
Stapel  Lange Ganzzahl in Größe des Stapelspeichers in Byte
Auswahlname  String in Name des erzeugten Prozesses
Param  Ausdruck in Parameter für die Methode
Operator in Einmaliger Prozess
Funktionsergebnis  Lange Ganzzahl in 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. 

  • Übergeben Sie in Stapel den Wert 0 für eine standardmäßige Stapelgröße, die für die meisten Anwendungen passt (empfohlene Einstellung)
  • In bestimmten Fällen wollen Sie lieber einen eigenen Wert verwenden. Sie müssen ihn in Bytes angeben. Sie sollten mindestens 64.000 Bytes zuweisen. Bei sehr langen, verschachtelten Methoden weisen Sie 512.000 Bytes oder mehr zu. Wenn Sie zuwenig Speicher zuweisen, tritt die Fehlermeldung “Der Stapelspeicher ist voll” auf. Der angegebene Wert muss ein Vielfaches von 2 sein.

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 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 oder zurückzugebenden Wert ein 4D Objekt (C_OBJECT), wird das JSON Formular in UTF-8 für den Server verwendet. Enthält das Objekt C_OBJECT 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.

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 auch 

New process

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: Prozesse
Nummer: 373

 
GESCHICHTE 

Geändert: 4D 2004.3

 
ARTIKELVERWENDUNG

4D Programmiersprache ( 4D v16)
4D Programmiersprache ( 4D v16.1)
4D Programmiersprache ( 4D v16.2)
4D Programmiersprache ( 4D v16.3)