Twitter

 6.5.x  7.x  8.0.x  8.5.x 

Terminate - Event von LotusScript Agenten

Manfred Meise  22 Mai 2012 19:39:47
 
Versucht man LotusScript anzuwenden, um Anwendungen mit entsprechendem Qualitätsanspruch zu erstellen, ist man leider nie vor Überraschungen sicher. So haben wir im Rahmen unserer Entwicklungsrichtlinien festgelegt, dass alle Agenten das Terminate Event verwenden, um zu erkennen, ob ein Agent ordnungsgemäß beendet wurde oder nicht (Abbruch durch Benutzer oder den Agentmanager bei Laufzeitüberschreitungen). Unser Codingpattern:

 
'1. LS-Tests\4- AgentTerminate:

Option Public
Option Declare


Public blnIsRunnning As Boolean

Sub Initialize
     
     blnIsRunnning = True
     
     ' - - Hier folgt die Anwendungslogik ---
     
     blnIsRunnning = False
     
End Sub

Sub Terminate
     
     
     If blnIsRunnning = True Then
             
             ' - - Behandlung der Abbruchsituation
             
     End If
     
End Sub


Dieses Vorgehen funktionierte bislang ganz gut - bis heute. Da haben wir (anders als sonst) im Rahmen der Abbruchsituation nicht nur einen einfachen Eintrag in ein Protokolldokument oder die Serverkonsole gemacht, sondern umfangreichere Logik eingesetzt. Hier wurde dann plötzlich die Abarbeitung an beliebigen Stellen (meistens "If Then Else", "Select Case" oder weiteren Unterprogramm-/Methodenaufrufen) beendet (ohne weitere Hinweise). Schnell wird mir klar: hier gibt es eine maximale Ausführungszeit, nach der der Code abgebrochen wird (macht eigentlich viel Sinn!). Frage: Was ist die Ausführungsbegrenzung im Terminate-Event?

Ein einfacher Test sollte Aufschluss geben:

 
'1. LS-Tests\4- AgentTerminate:

Option Public
Option Declare


Public blnIsRunnning As Boolean

Sub Initialize
     
     blnIsRunnning = True
     
     ' - - Hier folgt die Anwendungslogik ---
     
     blnIsRunnning = False
     
End Sub

Sub Terminate
     
     Dim i As Integer
     
     If blnIsRunnning = True Then
             
             ' - - Behandlung der Abbruchsituation
             
             Do While i < 20000
              'Sleep (1)
             Print "Durchgang: " & Cstr(i)
             i = i + 1
     Loop
             
     End If
     
End Sub


Meine Erwartungshaltung war, dass dieser interaktive Agent nach irgendeiner Zeit die Arbeit einstellt. Weit gefehlt ! Für eine gewisse Zeit ist der Client "Busy" (Sanduhr), die dann verschwindet. Der Zähler in der Statusleiste läuft weiter, während einige Funktionen im Client möglich sind. So kann ich z.B. einen Datenbank-Öffnen Dialog starten, jedoch keine Datenbank öffnen. Ich kann in der Datenbankansicht der aktuellen Datenbank wechseln, doch kein Dokument öffnen. Ich kann die laufenden Funktionen nicht abbrechen (z.B. mit Strg-Break) sondern nur indem ich den Client beende.

Warte ich in der Behandlungsschleife pro Durchgang ein wenig, so läuft dieser Code kontrolliert bis zum Ende durch. Überraschend!

Leider habe ich somit immer noch keinen Hinweis, was die maximale Ausführungszeit oder -beschränkung im Terminate Event angeht. Schade - aber vielleicht hat jemand mehr Erkenntnisse gewonnen?