Domino 9 und frühere Versionen > ND7: Entwicklung
Bug - Agent execution time?
Demian:
Moin,moin,
ich hab da ein kleines Problem mit einem Agenten der auf "vor Eingang neuer Mail" getriggert ist. Dieser wird nach nicht mal einer Minute Laufzeit wegen Überschreitung des Zeitlimits abgebrochen (siehe Anhang). Eingestellt ist bei uns eine Laufzeit von 30 min. am Tag und 15 min. Nachts. Ein anderer jedoch periodischer Agent in dieser DB läuft auch so seine 10 min. ohne Abbruch.
Hier der Code bei dem die Agent-Ausführung abbricht:
--- Zitat ---Sub City_EditAllHits
'**********************************************************************************************************************************************
'This function gets the changed City in the DB, and edit all documents which inherits data from the changed city. '**********************************************************************************************************************************************
'Parameters none
'**********************************************************************************************************************************************
On Error Goto ErrHandle
'**********************************************************************************************************************************************
Const EventName = "City_EditAllHits" 'for reports
'**********************************************************************************************************************************************
'Declarations
Dim viewLookup As NotesView
Dim docColToEdit As NotesDocumentCollection
Dim docToEdit As NotesDocument
Dim docArchive As NotesDocument
Dim strCity As String
'only for form CostObject
Dim itemInterface As NotesItem
'**********************************************************************************************************************************************
'search for all docs which inhereits changed data
If Not (docMod Is Nothing) Then
strCity = Cstr(docMod.CityOLD(0))
Call ReportWrite(Eventname & " - geändertes Quell-Dokument gefunden: " & strCity & ", suche zu ändernde Dokumente")
Set viewLookup = db.GetView("lkpEditCities")
Set docColToEdit = viewLookup.GetAllDocumentsByKey(strCity,True)
If docColToEdit.Count = 0 Then
Call ReportWrite(Eventname & " - es wurden keine zu ändernden Dokumente gefunden")
Exit Sub
End If 'docColToEdit.Count = 0
Call ReportWrite(Eventname & " - es wurden " & docColToEdit.Count & " zu ändernde Dokumente gefunden")
Set docToEdit = docColToEdit.GetFirstDocument
'run over all documents
While Not (docToEdit Is Nothing)
'create archive doc
Set docArchive = docToEdit.CopyToDatabase(db)
docArchive.Archived = 1
docArchive.ArchivedDate = Now
'change data
docToEdit.City = Cstr(docMod.CityNEW(0))
docToEdit.Provision = Ccur(docMod.ProvisionNEW(0))
docToEdit.AverageLinearDistance = Clng(docMod.AverageDistanceNEW(0))
Call docToEdit.AppendItemValue("$UpdatedBy",strMod_User)
'special form handles
'---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'CostObject
If docToEdit.Form(0) = "CostObject" Then
Call ReportWrite(Eventname & " - Kostenträger " & Cstr(docToEdit.ID(0)) & " wird bearbeitet | setze Schnittstellenkennzeichen - Auslösung = " & docMod.ProvisionNEW(0))
'set specified fields
Set itemInterface = docToEdit.GetFirstItem("InterfaceIndicator")
If itemInterface Is Nothing Then docToEdit.InterfaceIndicator = "U"
Set itemInterface = docToEdit.GetFirstItem("InterfaceIndicatorProvision")
If itemInterface Is Nothing Then docToEdit.InterfaceIndicatorProvision = "U"
End If 'docToEdit.Form(0) = "CostObject"
'Reservation
If docToEdit.Form(0) = "Reservation" Then
Call ReportWrite(Eventname & " - es wird eine Reservierung bearbeitet - erstelle Benachrichtigungsmail")
'set specified fields
docToEdit.ReservationCity = Cstr(docMod.CityNEW(0))
'delete not needed fields
Call docToEdit.RemoveItem("City")
Call docToEdit.RemoveItem("Provision")
Call docToEdit.RemoveItem("AverageLinearDistance")
'send info mail to owner of reservation
Call Reservation_Edit(docArchive,docToEdit)
'delete archive doc, because in the Archive only old reservations will be shown
Call docArchive.Remove(True)
End If 'docToEdit.Form(0) = "Reservation"
'---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'save all changes
If Not (docArchive Is Nothing) Then
Call docArchive.Save(True,False)
End If 'Not (docArchive Is Nothing)
Call docToEdit.Save(True,False)
'get next document
Set docToEdit = docColToEdit.GetNextDocument(docToEdit)
Wend
Call ReportWrite(Eventname & " - es wurden alle " & docColToEdit.Count & " Dokumente geändert")
End If 'Not (docMod Is Nothing)
Leave:
Exit Sub
ErrHandle:
Call ReportWriteError(EventName & " - Error" & Str(Err) & ": " & Error$ & " in Zeile " & Erl)
Resume Leave
End Sub
--- Ende Zitat ---
Der Abbruch erfolgte die beiden Male in der Zeile
--- Code: ---Call ReportWrite(Eventname & " - Kostenträger " & Cstr(docToEdit.ID(0)) & " wird bearbeitet | setze Schnittstellenkennzeichen - Auslösung = " & docMod.ProvisionNEW(0))
--- Ende Code ---
Die Ansicht lkpEditCities enthält knapp 23.000 Dokumente und ist in der 1. Spalte kategorisiert nach Ort. Der Ort bei dem abgebrochen wird enthält 730 Dokumente. Bei Orten mit weniger Dokumenten läuft der Agent laut meinem Log durch. Aber wieso wird er bei diesem Ort so früh abgebrochen? Die Dauer nach der abgebrochen wird variiert auch. Der letzte Abbruch erfolgte beim 195. Dokument nach einer Zeit von 32 Sekunden. Der Abbruch davor erfolgte beim 676. Dokument (da waren es noch 710 für diesem Ort) nach einer Zeit von 51 Sekunden.
Wenn ich die Dokumente bei denen abgebrochen wurde, über die Eigenschaften mit denen die bearbeitet wurden vergleiche, kann ich so keine Unterschiede feststellen. Sie haben die selben Items wie die anderen Dokumente auch.
Hat es was mit dem Code zu tun? Werden bei Agenten mit dieser Triggerung die Servereinstellungen ignoriert und nach einer anderen Zeitspanne abgebrochen? Ist es ein Bug? :-:
Da, dieser Fehler erstmal unbemerkt blieb stellt sich mir auch die Frage, welche Möglichkeiten es gibt um zu überprüfen ob ein Agent wegen Zeitüberschreitung abgebrochen wird/wurde um mich benachrichtigen zu lassen? Schade, dass hier nicht das normale Errorhandle greift :-\
Gibt irgendeins der Agenten-Flags hier vielleicht einen Wert zurück, der nur für abgebrochene Agenten gilt?
Gruß
Demian
koehlerbv:
Demian, schau bitte hier:
http://lotus-blogs.blogspot.com/2007/08/before-new-mail-arives-agent.html
Das ist ja auch naheliegend, da derartige Agents massiv an der Router-Performance ziehen.
Wenn es tatsächlich notwendig ist, bei New Mail sofort zu reagieren, würde ich auf jeden Fall einen anderen Weg wählen. Beispiel: Dein Router-triggered Agent erzeugt ein "Bescheid-sag"-Dokument. Und darauf stürzt sich ein zweiter Agent, der auf neue und modifizierte Dokumente reagiert.
HTH,
Bernhard
Demian:
Hallo Bernhard,
danke für den Link. Irgendwie hab ich aber auch ein Talent dafür in solche Fettnäpfchen zu treten ;D
Das mit dem 2. Agenten hatte ich auch schon überlegt, wenn sich das mit dem Ignorieren der Servereinstellungen bestätigt. Wobei ich den dann über .RunOnServer mit der ID aufrufen wollte?
Gruß
Demian
koehlerbv:
Genau das wird nichts, Demian: Dann wartet eben dieser Agent auf den zweiten - und da war doch was mit der Agent Excecution Time ;)
Bernhard
Demian:
ok, dann muss ich mir mal Gedanken machen, wie ich gewährleiste, dass jede Änderung sofort verarbeitet wird, um zu vermeiden die letzte Änderung ermitteln zu müssen.
Vielen Dank für das Bestätigen meiner Vermutung mit dem Trigger und Ignorieren der Servereinstellungen.
Wünsche dir noch ein schönes Wochenende.
Gruß
Demian
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln