Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: Charly77 am 03.01.07 - 16:57:16

Titel: LS --> Agent durch Agent starten
Beitrag von: Charly77 am 03.01.07 - 16:57:16
Moin Moin!

Dringlichkeit: "Ist nur ein Test und nicht überlebenswichtig, sozusagen >Nice to know<"

Folgende Lage: "Ich versuche auf einem Domino 5 Server mehrere Script-Agenten durch einen anderen Script-Agenten zum laufen zu bringen."

Hintergrund:
1. "Es sollen nicht immer alle Agenten als "periodisch" laufen(unübersichtlich)"
2. Es sind nur bestimmte DB betroffen (hier im Ordner "Test" auf dem Test-Server)
3. Alle Agenten sollen hier "dynamisch" gestartet werden können (DB mit betroffenen Agent in den Ordner repilzieren, fertig"


Bisheriges Ergebnis:
1. Wenn ich den Agenten per Hand starte, funktioniert alles wunderbar.
2. Sobald der Agent "periodisch" läuft, werden die anderen Agenten, die er "anschubst" nicht ausgeführt.
3. Das Protokoll des "periodischen" Agenten sagt "Script ohne Fehler ausgeführt"
4. Die Protokolle der anderen Agenten sagen "Nüx gemacht"
5. Der Server hat auf alle DB "Manager"-Zugriff, um diesen Fehler schon mal auszuschliessen

Hier der Code (Scriptbibliothek)

Ich habe mir in der "catalog.nsf" eine Ansicht gebastelt, aus der ich die Namen der betroffenen Datenbänke auslese.

Code
Function Agenten_starten
Dim se As New NotesSession
Dim db As NotesDatabase
Dim db2 As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim agent As NotesAgent

Set db = se.GetDatabase("Test-Server", "catalog.nsf")
Set view = db.GetView("test")
Set doc = view.GetFirstDocument
	
While Not doc Is Nothing
	Pfad = doc.GetItemValue("Pathname")
	Titel = doc.GetItemValue("Title")
	L1 = Len(Pfad(0))
	L2 = L1 - 12
	
	db_Name = Right(Pfad(0), L2)
	Set db2 = se.GetDatabase("Test-Server", Cstr(db_Name))
	Gosub agent
	
	Set doc = view.GetNextDocument(doc)
Wend
	
Goto ende
	
agent:
Call db2.Open( "Test-Server", "Test\"+Cstr(db_Name) )
Set agent = db2.GetAgent("(Testagent2)")
If agent.Run = 0 Then
Print "Agent ohne Fehler ausgeführt!"
Else
Print "Agent wurde abgebrochen!"
End If
Call db2.close
Return
	
ende:	
End Function
Titel: Re: LS --> Agent durch Agent starten
Beitrag von: Driri am 03.01.07 - 17:03:49
Auf was für einen Ausführungstyp sind denn die anderen Agenten gestellt ?

Ich meine die müssen periodisch sein, damit die von einem anderen Agenten aus aufgerufen werden können.
Titel: Re: LS --> Agent durch Agent starten
Beitrag von: Charly77 am 04.01.07 - 08:39:06
Moin Diri,

die anderen stehen auf "Manuell aus der Liste der Agenten",
dass war auch so beabsichtigt weil diese halt nicht periodisch laufen sollen, es sei denn der eine "Master-Agent" läuft und schubst diese an.

P.s.: Wenn ich den Master-Agenten manuell ausführe funktioniert das aufrufen der anderen einwandfrei.

Ich werde "periodisch" mal ausprobieren!
Titel: Re: LS --> Agent durch Agent starten
Beitrag von: m3 am 04.01.07 - 09:12:16
Auf einem 6er-Server funktioniert das wunderbar - die aufgerufenen Agenten sind zwar auf "periodisch" eingestellt, aber deaktiviert.

1) Bau mal ein paar "Print" Statements in die anderen Agents ein, damit Du im Log siehst, ob sie gestartet wurden.

2) Call db2.Open( "Test-Server", "Test\"+Cstr(db_Name) )
Das würde ich durch ein
Code
erg = db2.Open( "Test-Server", "Test\"+Cstr(db_Name) )
if( not erg) Then
...
ersetzen.

3) Set agent = db2.GetAgent("(Testagent2)")
Das würde ich durch ein
Code
Set agent = db2.GetAgent("(Testagent2)")
If Not(agent Is Nothing) Then
...
ersetzen.
Titel: Re: LS --> Agent durch Agent starten
Beitrag von: Driri am 04.01.07 - 09:18:40
Ich kann mich dunkel erinnern, daß ich so ein Problem auch schon mal hatte. Ich habe dann die aufzurufenden Agenten auf "Periodisch : Nie" gestellt und dann funktionierte das auch.
Titel: Re: LS --> Agent durch Agent starten
Beitrag von: Charly77 am 04.01.07 - 10:27:51
Hab die Agenten nun auf "Periodisch: Nie" laufen, bekomme aber das gleiche Ergebnis ...

Die nun eingebauten Print-Statements zur Kontrolle in den anderen Agenten erscheinen auch nicht auf der Konsole, der einzige Agent der ausgeführt wird ist mein Master-Agent, und das ohne Fehler.

Aber manuell funktioniert das alles wieder wunderbar.
Titel: Re: LS --> Agent durch Agent starten
Beitrag von: m3 am 04.01.07 - 14:35:12
Laufen alle Agenten auf ein und demselben Server, oder sind sie auf mehrere Verteilt?
IIRC gabs da eine Einschränkung unter R5.
Titel: Re: LS --> Agent durch Agent starten
Beitrag von: Charly77 am 04.01.07 - 14:41:37
Laufen alle auf dem selben Server.

Ich frage mich schon die ganze Zeit warum das alles manuell funktioniert,
ich starte ja schliesslich auch "nur" den Masteragenten der dann ohne Fehler durchrauscht. Allerdings dann rauschen die anderen mit.

Alle Scripts wurden aufs Backend geschnitzt.


Meine Alternative wäre, den Master-Agenten täglich/wöchentlich(je nach Bedarf) einmal von Hand zu starten.
Titel: Re: LS --> Agent durch Agent starten
Beitrag von: m3 am 04.01.07 - 14:46:53
Ich würd mal
1) Das von mir oben angesprochene Error-Handling einbauen
2) Das Agent-Logging ein bissl höher drehen.
Titel: Re: LS --> Agent durch Agent starten
Beitrag von: Charly77 am 04.01.07 - 15:46:57
Hab eine Lösung!!

Ich habe nun alle Scripte in den Master-Agenten gebracht.
Nun läuft das alles so wie es soll, und ich erspare mir als Nebeneffekt noch die zusätzlichen Agenten in allen Datenbanken.

Danke euch allen für die Unterstützung!
Titel: Re: LS --> Agent durch Agent starten
Beitrag von: m3 am 04.01.07 - 15:50:56
Das ist keine Lösung, das ist ein Workaround.
Titel: Re: LS --> Agent durch Agent starten
Beitrag von: Glombi am 04.01.07 - 15:55:35
Meine Vermutung ist, dass es am

Call db2.Open( "Test-Server", "Test\"+Cstr(db_Name) )


liegt. In R5 kann man keine Agenten auf einem "anderen" Server öffnen. Und woher soll der Server wissen, dass "Test-Server" er selbst ist  ;)

Also stattdessen:
Call db2.Open( "", "Test\"+Cstr(db_Name) )


Andreas
Titel: Re: LS --> Agent durch Agent starten
Beitrag von: Charly77 am 04.01.07 - 16:59:06
Hab das ganze nochmals ausprobiert, auch bei ...

Call db2.Open( "", "Test\"+Cstr(db_Name) )

... hatte ich grade keinen Erfolg zu verbuchen.

Ich schlaf da nochmal 1-2 Nächte drüber, bis dahin werde ich meinen komletten Master-Agenten mit allen enthaltenen Scripten benutzen.

Falls ich noch eine Lösung für den anderen Weg finde, werd ich das hier posten.

Dank an euch alle!
Titel: Re: LS --> Agent durch Agent starten
Beitrag von: m3 am 04.01.07 - 17:43:33
Zum dritten und letzten mal: Bau eine Fehlerabfrage ein!