Domino 9 und frühere Versionen > Entwicklung
aus Skript gestarteter Agent läuft semi-synchron?
Axel_Janssen:
Hi,
ein Skript startet einen Agenten und übergibt eine Doc-ID.
Der Agent macht einen SQL-Select gegen DB2 und schreibt das Ergebnis in das Dokument mit der ihm übergebenen DocID.
code in Maske:
--- Code: ---idVonEinemDoc = doc.noteID
someAgent.runOnServer(idVonEinemDoc)
call doc.save (true, false)
--- Ende Code ---
code in Agent:
--- Code: ---/*
Der Agent holt sich eine Referenz auf das Dokument der übergebenen DocID und macht einen SQL-Select gegen DB2 und schreibt das Ergebnis in das Dokument mit der ihm übergebenen DocID.
Genauer: Er iteriert durch das Resultset und hängt die einzelnen Spaltenwerte eines RDBMS-Datensatz jeweils an gewisse Notes-ITems im Dokument an.
*/
--- Ende Code ---
Ergebnis ist aus meiner Sicht kurios.
Der Agent läuft an.
Bevor das doc.save im Maskencode das Dokument persistiert (abgespeichert hat) hat der Agent (der ja über das selbe Dokument läuft) bereits einige, aber nicht alle im Select gefundenen Datensätze angehängt.
Irgendwie laufen also beide asynchron.
Synchron hiesse: Der caller (das Skript in der Maske) wartet, bis der von ihm aufgerufene Agent beendet ist.
Asynchron heisst: der code im caller läuft einfach weiter und kümmert sich nicht darum, wann der aufgerufene code terminiert.
Es ist in jedem Fall asynchron.
Aber der Skriptcode in der Maske wartet ziemlich lange bis er das doc.save ausführt (deshalb semi-synchron)
In dieser Zeit hat der Agent auf dem Server:
- sich mit einer remoten DB2 verbunden.
- einen simplen sql-Select gegen eine Tabelle derselben abgesendet.
- ein Resultset erhalten.
- einige (aber nicht alle) Datensätze des Resultsets iteriert
- diese Werte jeweils an die Items des Dokuments angehängt.
Das Verhalten ist so. Das ist weniger eine Frage, als eine Feststellung.
Kann jemand was schlaues dazu sagen?
Ich könnte jetzt theoretisch im Maskencode vor doc.save
sowas schreiben wie
--- Code: ---while doc.getItemValue("aFlag")(0) <> "1"
wend
--- Ende Code ---
und im Agenten:
/*
iteriere gesamtes Resultset
doc.replaceItemValue("aFlag", "1")
*/
und ein paar Sicherheiten einbauen (Zeitvariable in Endlos-while wend in Masken-code.
Das ist mir aber zu sehr gehackt.
Gruß Axel
animate:
zu dem Verhalten kann ich nix Schlaues sagen. Ich kann eigentlich gar nix schlaues sagen, nur eine Frage stellen.
Besteht die Möglichkeit, das Dokument im aufgerufenen Agent zu starten, nicht im aufrufenden?
Oder musst du nach dem Befüllen mit Werten noch irgendwas mit dem Dokument machen?
Axel_Janssen:
--- Zitat von: Thomas Völk am 28.02.04 - 07:20:39 ---Besteht die Möglichkeit, das Dokument im aufgerufenen Agent zu starten, nicht im aufrufenden?
--- Ende Zitat ---
Nö. Hat etwas mit der spezifischen Architektur der Anwendung sowie der Tatsache, dass auf dem Client keine DB2-Clients intalliert ist, zu tun.
animate:
ich seh grade, das ich bockmist geschrieben habe.
was ich meinte war: besteht die Möglichkeit, das Dokument in dem Agent zu speichern, in dem es auch gefüllt wird?
Semeaphoros:
Axel: mit RunOnServer ist doch eigentlich gegeben, dass das Ding asynchron läuft, das rennt ja dann auf einer anderen Maschine und das dann im lokalen Agenten zu speichern, schreit ja schon fast nach einem Speicher - Konflikt, die Lösung von Thomas ist da also eigentlich sehr naheliegend.
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln