Domino 9 und frühere Versionen > ND7: Entwicklung

Bug - Agent execution time?

(1/4) > >>

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