Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: DatenDuck am 09.06.10 - 10:24:40

Titel: Zeitgesteuerten Agenten nicht mehrfach starten
Beitrag von: DatenDuck am 09.06.10 - 10:24:40
Hallo Leute,

wie kann man verhindern, dass ein zeitgesteuerter Agent nicht mehrfach auf dem selben Server startbar ist?
Das gilt sowohl für den Fall wenn ein Agent sehr lange läuft und den Agent Manager Intervall überschreitet, als auch wenn (aus welchem Grund auch immer) der Agent per "tell amgr run ..." gestartet wird, während bereits eine Instanz läuft.

Ich finde keine Art von "single instance" Option bei einem Agenten, daher schätze/hoffe ich, das lässt sich per Script realisieren.

Vielen Dank schon mal für die Hilfe!

Bis dann,
-Moritz
Titel: Re: Zeitgesteuerten Agenten nicht mehrfach starten
Beitrag von: tfrenz am 09.06.10 - 10:51:08
Hallo,

ähnliche Probleme hat man auch, wenn man mehrere Server in einem Cluster hat und im Agenten keinen eindeuteigen Server hinterlegt hat.
Man bedenke das in einem Cluster ein Agent nicht nur auf einen bestimmten Server laufen zu lassen.

Gruß
Thomas
Titel: Re: Zeitgesteuerten Agenten nicht mehrfach starten
Beitrag von: m3 am 09.06.10 - 10:51:18
Designer-Hilfe, Thema "CodeLock function"
Titel: Re: Zeitgesteuerten Agenten nicht mehrfach starten
Beitrag von: DatenDuck am 09.06.10 - 13:15:44
Sieht ja schon mal gut aus!
Was nur irgendwie hinderlich ist, ist dass CodeLock() bei gesetztem Lock wartet, statt False zurückzugeben. So kann man den Agenten ja nicht abbrechen, sondern man wartet lediglich bis der zur Zeit laufende Agent fertig ist.
Das verhindert zwar, dass der selbe Agent nicht mehrfach läuft, dafür bildet sich eine Warteschlange...

Gibt's da irgend eine Abbruchlösung (oder habe ich das nur noch nicht ganz verstanden mit den Locks)?
Titel: Re: Zeitgesteuerten Agenten nicht mehrfach starten
Beitrag von: Peter Klett am 09.06.10 - 13:40:21
Ich würde an eine zentrale Stelle den Startzeitpunkt vom Agenten schreiben lassen (z.B. notes.ini, ein Einstellungs- oder Profildokument o.ä.). Als letzte Aktion des Agenten würde ich diesen Eintrag wieder löschen.

Startet der Agent und findet einen Eintrag, wird das Script beendet. Zur Sicherheit würde ich zusätzlich eine Toleranzzeit definieren, z.B. eine Stunde, falls der Agent beim vorigen Lauf abgestürzt ist. Wenn der gefundene Eintrag älter als die Toleranzzeit ist, läuft er trotzdem weiter.
Titel: Re: Zeitgesteuerten Agenten nicht mehrfach starten
Beitrag von: DerAndre am 09.06.10 - 13:53:46
Also sowas wie ein Semaphor.

Wie wäre es mit einer Datenbank in der 'Laufdokumente' hinterlegt sind.
Beim Start setzt der Agent sein Dokument auf 1 wenn er laufen darf, ansonsten erfolgt der Abbruch des Agenten.
Am Ende wird die Semaphore wieder auf 0 gesetzt.
Dann noch die Zeittoleranz wie von Peter beschrieben.
Titel: Re: Zeitgesteuerten Agenten nicht mehrfach starten
Beitrag von: BigWim am 09.06.10 - 14:47:10
Zitat
ähnliche Probleme hat man auch, wenn man mehrere Server in einem Cluster hat und im Agenten keinen eindeuteigen Server hinterlegt hat.
Man bedenke das in einem Cluster ein Agent nicht nur auf einen bestimmten Server laufen zu lassen.

Das war mein Problem. Ich habe es über Einstellungsdokumente gelöst - allein mangels wissens um die CodeLock-Funktion.

Darin definiere ich den Servernamen. Vor der eigentlichen Ausführung wird geprüft, ob aktuelle Servername dem Servernamen im Einstellungsdokument übereinstimmt. Ist die Bedingung erfüllt, rennt der Agent los.

Zudem ist dieses Verfahren entsprechend den eigenen Anforderungen erweiterbar, sodass man nicht unbedingt an die Gestaltung ran muß. Mir sind da schon einige Dinge in den Sinn gekommen, die das Testen und Protokollieren vereinfachen können ....

Markus
Titel: Re: Zeitgesteuerten Agenten nicht mehrfach starten
Beitrag von: DatenDuck am 09.06.10 - 15:08:30
Ich denke, ich bin einen Schritt weiter. (Die Problematik mit dem Cluster stellt sich erst mal nicht, weil es nur darum geht, den selben Agenten nicht auf ein und demselben Server mehrfach laufen zu lassen).

Code
Dim intStatus As Integer
	Dim intLockID As Integer		
	intLockID = Createlock("Lockerei")

	If Codelockcheck(intLockID) = 0 Then
		intStatus = Codelock(intLockID)		
	Else		
		Print "!!!!!!!!!!!!!!!!!!!!!!!!!!! Agent läuft bereits!!!!!!!!!!!!!!!!!!!!!!!!!!!"
		Exit Sub
	End If
	
	Print "AGENT Gestartet!"
	Sleep(3600)
	Print ">>>>>>>>>>>>>>>>  AGENT Exit <<<<<<<<<<<<<<<<<<<"
	
	intStatus = Codeunlock(intLockID)
	intStatus = Destroylock(intLockID)

Die einzige Sache die mir hierbei soweit aufgefallen ist, ist dass dieses Verfahren nicht funktioniert wenn der Agent bereits regulär durch den Agent Manager gestartet ist und man den Agenten nun noch mal per tell amgr run anwirft. Das eigentlich bereits gelockte lock (Aus dem regulären Start) wird nicht erkannt wenn der Agent per run ein weiteres Mal gestartet wurde. Führt man tell amgr run aber wiederum mehrfach aus, wird wenigstens sichergestellt das bei dieser Startart der Agent nicht mehrfach gestartet werden kann.

Ich werde noch etwas weiter forschen.