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:
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
Der Abbruch erfolgte die beiden Male in der Zeile
Call ReportWrite(Eventname & " - Kostenträger " & Cstr(docToEdit.ID(0)) & " wird bearbeitet | setze Schnittstellenkennzeichen - Auslösung = " & docMod.ProvisionNEW(0))
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