Das Notes Forum
Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: skywook am 26.06.13 - 14:32:12
-
Hallo,
in einer DB starte ich (manuell) einen Agenten der mir eine Datei liest und daraus neue Dokumente in der DB generiert. Leider ist mein Client blockiert bis der Agent durchgelaufen ist. Der Agent darf nur manuell gestartet werden.
Kann ich das Problem über den RunOnServer lösen? Verstehe leider diese Methode nicht.
Für eine Erklärung wäre ich sehr dankbar. In der Forumsuche oder in der Hilfe steht leider nichts genaues.
-
RunOnServer blockiert genauso, weil das Script auf den Rückgabewert des Agenten wartet.
Dir hilft die Eigenschaft "Im Hintergrundthread des Clients ausführen" (englisch: "run in background client thread") weiter... Ein Agent, der so gestartet ist, blockiert den Client nicht.
Du kannst auch hier zusätzlich noch ein RunOnServer und einen zweiten Agenten benutzen, damit der eigentliche AgentenCode lokal am Server läuft und keine Netzwerkaktivitäten das ganze ausbremsen...
EDIT: ACHTUNG !!! Ein Agent, der per "RunOnServer" gestartet wird, kann nicht mehr beendet werden. Der läuft im Server- Thread ausserhalb des AgentenManagers und auch ausserhalb dessen Beschränkungen. Produzierst Du eine Endlosschleife, dann läuft der Agent, bis es zu einem Overflow kommt oder Du alternativ den Server neu startest... Das gilt auch, wenn man den aufrufenden Agenten im Client per Strg + C abbricht..
-
Vielen, vielen Dank !
Noch eine Kleinigkeit, kann ein Teil des Scripts auch in einer ScriptBibliothek ausgelagert sein oder darf sich das ganze nur innerhalb der Agenten abspielen?
-
Klar, ich arbeite NUR mit Script- Bibliotheken
-
Hallo Tode,
ich möchte ebenfalls einen Agenten am Server laufen lassen, ohne dass mein Client blockiert wird.
Ich habe dazu diesen alten Threat gefunden:
RunOnServer blockiert genauso, weil das Script auf den Rückgabewert des Agenten wartet.
Dir hilft die Eigenschaft "Im Hintergrundthread des Clients ausführen" (englisch: "run in background client thread") weiter... Ein Agent, der so gestartet ist, blockiert den Client nicht.
Du kannst auch hier zusätzlich noch ein RunOnServer und einen zweiten Agenten benutzen, damit der eigentliche AgentenCode lokal am Server läuft und keine Netzwerkaktivitäten das ganze ausbremsen...
Wenn ich dich richtig verstehe schlägst du ja einen Agenten vor, für den "Im Hintergrundthread des Clients ausführen" gewählt ist. In diesem Agenten erfolgt dann der eigentliche Aufruf "Agent.RunOnServer".
Ist das dann nicht doch ein wenig unsauber, wenn ich z.B. meinen Notes-Client neu starte während im Hintergrund noch ein Threat läuft, der auf die Rückmeldung des anderen Agenten wartet?
Wenn ich keine Rückmeldung benötige, wäre es doch "sauberer", über session.SendConsoleCommand einen "tell amgr run" am Server abzusetzen?
Grüße,
Gregor
-
Moin
Nur, dass da evtl. die Rechte im Weg stehen, da nicht jeder Consolen Command schicken kann.....
-
Moin
Nur, dass da evtl. die Rechte im Weg stehen, da nicht jeder Consolen Command schicken kann.....
Das kann man ja auch wieder über einen zweiten Agenten machen. User ruft Agent 1 auf, dieser hat die entsprechenden Ausführungsrechte und setzt dann den Konsolenbefehl ab. Habe das heute hier so gemacht und das scheint zu laufen.
-
Kleiner Praxistip.
Da eine Rückmeldung fehlt muss man programmtechnisch verhindern dass der
Agent auf dem Server mehrfach gestartet wird und parallel läuft. Das geht
z.B. mit Semaphorfiles oder den Lock-Funktionen von Lotusscript. Je nachdem
was der Agent macht kann das sonst sehr schnell zum Desaster führen.
Peter