minisys - 2008-03-06

Hallo!

Seit Fassung GT.M 4.x beschäftige ich mich sehr intensiv mit GT.M und muß gerne zugeben, dass nach einiger Gewöhnungszeit GT.M ein wirklich tolles M ist. Schnell und flexibel, nur die Stabilität der Datenbanken läßt (noch) zu wünschen übrig. Alles in Allem kann ich nur zu GT.M raten.
Das aber nur zur Einleitung.

Ok, ich habe vor mehr als 3 Jahren begonnen den ersten WEB-Server unter GT.M zu schreiben, mittlerweile habe ich auch ein brauchbares (kein optimales) Programm am Laufen, jedoch mit der Einschränkung, dass es mir irgendwie nicht gelingen will, die Aufgaben des WEB-Traffics auf mehrere Jobs/Prozesse zu verteilen. Ergo werden parallele Anfragen sequentiell abgehandelt und unter starker Beanspruchung treten enorme Wartezeiten auf.

Folgendes habe ich (Danke an Frans Witte!) in die Routine integriert:
----------------------------------------
s %ZNPort=80 ;Default
n $ZT s $ZT="ZGOTO "_$ZLEVEL_":singleQ" ;ET
s %ZNDev="SCK$"_$J
O %ZNDev:(ZLISTEN=%ZNPort_":TCP":DELIMITER=$C(13,10,58,27,95):ATTACH="listener"):%ZNTimeS:"SOCKET"
e  s %http="-1,NotOpen" q
s $ZTRAP="ZGOTO "_$ZLEVEL_":singleC",%http=0
u %ZNDev s %http(0)=$KEY
W /LISTEN(1) s %http(1)=$KEY

FetchSocket u %ZNDev k (%ZNPort,%ZNTimeS,rootdir,startpg,postrtn,vdotrtn,stoprtn,%ZNDev)
s %http=0 f  d  q:%http  i $$stop c %ZNDev H
. W /WAIT(%ZNTimeS)
. I $KEY]"" s %http(2)=$KEY,%http=2,%http("IP")=$p($KEY,"|",3) q
; Store the connection socket in local variable,
s %ZNSock=$p($KEY,"|",2)
; Close listen socket, so another process can start listening on this port. ???
; Force connection socket to be the active ???

U %ZNDev:(SOCKET=%ZNSock:NOWRAP)
s %http("usedev")="U """_%ZNDev_""":(SOCKET="""_%ZNSock_""":NOWRAP)"
-------------------------------------------

Und das funktioniert alles ziemlich prima, dass Device (%ZNDev) und der Socket vertragen sich recht gut, aus dem Device kann ich die Daten vom Browser auslesen und das Ergebnis (HTML-Text) zurückgeben.

Nun meine Frage:
Wie kann ich den aktuellen Socket (funktionsfähig) von einem anderen Job/Task bedienen bzw. wie kann ich bewerkstelligen, dass ich parallel zur aktuellen Bedienung des einen Sockets Weitere bedienen kann?
Die Doc's über GT.M habe ich bereits vorwärts und rückwärts durchgearbeitet und (fast) alles mögliche probiert. Sobald ich versuche das Device zu schliessen oder den aktuellen Socket zu detachen bricht die Verbindung zum Browser ab.
Wer weiß Rat?

Stefan