Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: Axel_Janssen am 28.02.04 - 00:49:48

Titel: aus Skript gestarteter Agent läuft semi-synchron?
Beitrag von: Axel_Janssen am 28.02.04 - 00:49:48
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)

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.  
*/

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

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


Titel: Re:aus Skript gestarteter Agent läuft semi-synchron?
Beitrag von: animate am 28.02.04 - 07:20:39
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?
Titel: Re:aus Skript gestarteter Agent läuft semi-synchron?
Beitrag von: Axel_Janssen am 28.02.04 - 09:52:33
Besteht die Möglichkeit, das Dokument im aufgerufenen Agent zu starten, nicht im aufrufenden?
Nö. Hat etwas mit der spezifischen Architektur der Anwendung sowie der Tatsache, dass auf dem Client keine DB2-Clients intalliert ist, zu tun.
 
Titel: Re:aus Skript gestarteter Agent läuft semi-synchron?
Beitrag von: animate am 28.02.04 - 10:22:19
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?
Titel: Re:aus Skript gestarteter Agent läuft semi-synchron?
Beitrag von: Semeaphoros am 28.02.04 - 11:41:48
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.
Titel: Re:aus Skript gestarteter Agent läuft semi-synchron?
Beitrag von: Axel_Janssen am 28.02.04 - 11:45:58
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?

auch nicht.
der aufrufende code läuft in einer Schleife und ist da wirklich nicht so ohne weiteres herauszuholen (hat was mit DWF zu tun).
Die einzige Möglichkeit besteht wohl darin eine eigene serverseitige Version des aufrufenden codes zu schreiben (code in Verzweigung if agent.laueftAufServer = true), wo es gar keinen aufgerufenen Agenten gibt, sondern die ODBC-Operationen direkt in den "aufrufenden" Agenten geschrieben werden. Exakt gesprochen, gibt es dann keinen aufgerufenen Agenten. Dies käme einer Neuimplementierung weiter Bestandteile einer von mir nicht geschriebenen komplexen Anwendung gleich.
Hinweis: An der problematischen Stelle ist der aufrufende code genau gesprochen nicht in einer Maske, sondern in einem Agenten, der eben von der workstation oder auf dem Server gestartet werden kann.

Du redest aber wirklich keinen bullshit.  

Gruß Axel
Titel: Re:aus Skript gestarteter Agent läuft semi-synchron?
Beitrag von: Axel_Janssen am 28.02.04 - 11:50:12
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.

Hi Jens,

wenn das Dokument im Server nicht gespeichert wird, gibt es keinen Speicherkonflikt.
Interessant finde ich das lange Zeit-lag zwischen agent.runOnServer() und doc.save auf der client-Seite.

Gruß Axel
Titel: Re:aus Skript gestarteter Agent läuft semi-synchron?
Beitrag von: Semeaphoros am 28.02.04 - 13:33:53
Hm, wie soll denn das überaupt funktionieren? Das Doc.Save auf dem Client schreibt ja eigentlich die Memory-Instanz, die auf dem Client lebt, in die DB zurück. Auf diese Memory-Instanz hat doch der Server, auf dem der gerufene James Bond läuft, gar keinen Zugriff. Wie kommen denn da die vom servseitigen 007 eingesammelten Daten überhaupt in das Dokument?
Titel: Re:aus Skript gestarteter Agent läuft semi-synchron?
Beitrag von: animate am 28.02.04 - 13:59:44
Das ist natürlich nicht von der Hand zu weisen. Das scheint eine sehr abenteuerliche Konstruktion zu sein und das macht den Satz
Zitat
Das ist mir aber zu sehr gehackt.

sehr witzig für mich. Könnte ja sein, dass das, was du als Hack bezeichnest, im Vergleich zum existierenden Programm gar kein Hack mehr ist.

(Offtopic: Hacks im M$ Quellcode We are morons (http://www.kuro5hin.org/story/2004/2/15/71552/7795))
Titel: Re:aus Skript gestarteter Agent läuft semi-synchron?
Beitrag von: Semeaphoros am 28.02.04 - 14:57:02
Ineressante Ueberlegung von Thomas (nebst einem interessanten Link). Dieser Sichtweise könnte ich mich irgendwie auch anschliessen.
Titel: Re:aus Skript gestarteter Agent läuft semi-synchron?
Beitrag von: Gandhi am 28.02.04 - 15:52:05
Idee:

Agent (auf Server) setzt ein bestimmtes Flag (z.b. AgentTerminated=True)

folgende 'Schleife' im Event:

starte Agent (auf Server)
hole doc (von Server)
gucke, ob der Agent ein bestimmtes Flag im doc gesetzt hat.
Solange er das nicht tut - Schleife wiederholen....nicht performant...evtl. eine Endlosschleife - vielleicht aber ein Versuch wert

Würde mich interessieren, ob sowas geht....
Titel: Re:aus Skript gestarteter Agent läuft semi-synchron?
Beitrag von: Semeaphoros am 28.02.04 - 18:18:57
Ich glaube, das ist genau das, was Axel in seinem ersten Posting meinte, als er dieses schrieb:



Ich könnte jetzt theoretisch im Maskencode vor doc.save
sowas schreiben wie
Code
while doc.getItemValue("aFlag")(0) <> "1"
wend

und im Agenten:
/*
iteriere gesamtes Resultset
doc.replaceItemValue("aFlag", "1")
*/
und ein paar Sicherheiten einbauen (Zeitvariable in Endlos-while wend in Masken-code.



Titel: Re:aus Skript gestarteter Agent läuft semi-synchron?
Beitrag von: Axel_Janssen am 28.02.04 - 19:44:38
Ja. Genau. Und sowas will ich eigentlich nicht machen.