thomas_walter
I'm new here

Automatische Mailbenachrichtigung bei Fehlern in Aufträgen

It's a great feature to have jobs run automatically wíthout any user interaction, f.e. to do periodic deployment to a webserver.

We added some steps to check automatically if the jobs were ended with an error and if an error occured an admin-group receives an automatic mail message.

To do this we added two steps and the end of each job.

1. Script to check if there was an error

import de.espirit.firstspirit.access.schedule.*;

result  = "";
tasks = context.tasks;
idx = context.taskIndex;
taskresults = context.getTask().getScheduleEntry().getRunningEntries().get(0).getState().getTaskResults();
int errors =  0;
step = "";
int numberpages = 0;

result = "Bei der Ausführung des folgenden Auftrags ist ein Fehler aufgetreten !\n\n";
result=result+"Projekt: " +context.getProject().getName() +"\n";
result=result+"Auftrag: " +context.getTask().getScheduleEntry().getName() +" \n\n";

for (int i = 0; i <idx; i++) {
     step = taskresults.get(i).getState().toString();
     name= tasks.get(i).getName().toString();
     result = result + step + " (" + name + ")\n";
     if (step.equals( "ERROR") || step.equals( "FINISHED_WITH_ERRORS")) {
         errors++;
    }

    if ( (context.getTask().getScheduleEntry().getTasks().get(i) instanceof GenerateTask) &&  step.equals( "SUCCESS")  ) {
         numberpages = numberpages + taskresults.get(i).getTaskInfoBean().getPageIndex();
    }
}

result = result+"\n";

if (numberpages>0) {
    result = result+"Es wurden insgesamt " + numberpages + " Seiten erzeugt.\n\n";
}

if (errors>0) {
    result = result+"ACHTUNG Es ist/sind " + errors +" FEHLER aufgetreten !\n\n";  
} else {
    tasks.get(idx + 1).setActive(false);
}

result = result+"Diese Mail wurde automatisch vom CMS Firstspirit generiert. Für technische Rückfragen senden Sie bitte eine Nachricht an admins@ourcompany.de \n";
context.setProperty("result", result );

Wer möchte kann die Mail auch nur beim Status ERROR erzeugen und nach belieben auch die Ausgabe anpassen.

Ich habe mal beispielhaft die Anzahl der generierten Seiten im Skript belassen. Wer dies nicht benötigt kann diese Zeilen einfach entfernen.

2. Mail-Aktion (defaultmässig aktiv und wird auch im Fehlerfall ausgeführt).

Empfänger kann nach Belieben gewählt werden.

Der Verwendungszweck wird über die erste Zeile des Mailtextes angepasst - darf aber nicht leer bleiben.

Im Mailtext prüfe ich aktuell noch ob mein Prüfskript ein Fehler hatte und gebe falls dies der Fall war trotzdem Angaben zum Projekt und Auftrag aus:

$CMS_SET(#context.task.subject, "Problem mit FirstSpirit-Auftrag aus Projekt " +  #context.project.name + " (" + #context.getTask().getScheduleEntry().getName() + ")" )$

$CMS_IF(!#context.getProperty("result").isEmpty)$
$CMS_VALUE(#context.getProperty("result"))$
$CMS_ELSE$
Fehler bei der Ausführung des Skriptes "Überprüfung auf Fehler"
im Projekt: $CMS_VALUE(#context.getProject().getName())$
beim Auftrag: $CMS_VALUE(#context.getTask().getScheduleEntry().getName())$

Der Auftrag startete um $CMS_VALUE(#context.task.scheduleEntry.runningEntries.get(0).startTime.format("H:mm:ss"))$

Diese Mail wurde automatisch vom CMS Firstspirit generiert. Für technische Rückfragen senden Sie bitte eine Nachricht an admins@ourcompany.de
$CMS_END_IF$

Labels (2)
Comments

Zu "Leider ist es m.W. aktuell nicht möglich in diesem Schritt dynamisch den Betreff zu verändern.":

Ich habe es selber noch nicht probiert, aber das Interface MailTask hat die Methode setSubject(String) mit der das möglich sein sollte:

               $CMS_SET(#context.task.subject, "Mail for project " +  #context.project.name)$

Vielen Dank für die Info. Das funktioniert so - ich habe das oben ergänzt

Ist es möglich, die ersten Warnings und Errors direkt in der E-Mail als Text auszugeben, so wie es bei FirstSpirit 3.1 der Fall war?

Leider habe ich in der API nichts dazu gefunden.

Das Entpacken der angefügten Zip-Dateien ist manchmal etwas mühsam ...

Ja, ist es.

Mit diesem Skript (welches davon ausgeht, dass die Generierungsaktion die erste Aktion im Auftrag ist)

**********************************************************

import java.io.InputStreamReader;

import java.io.BufferedReader;

logfile = "";

knoten = "";

truncate = true;

task = context.getTask();

inputStream = task.getScheduleEntry().getRunningEntries().get(0).getState().getTaskResults().get(0).getLogfile();

context.logInfo("Groesse des Logfiles = " + inputStream.available());

br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));

for(i=0;i<200;) {

  zeile = br.readLine();

  if(zeile==null) {

    i = 200;

    truncate = false;

  } else if((zeile.length()>5) && (zeile.substring(0,5).equals("ERROR") || (zeile.substring(0,5).equals("WARN ")))) {

  i = i+1;

  logfile = logfile + zeile + "\n" + Knoten + "\n\n";

  } else if((zeile.length()>5) && (zeile.substring(0,5).equals("INFO ") && (zeile.contains("generating page reference")))) {

  Knoten = "Seitenreferenz: " + zeile.substring(zeile.indexOf("generating page reference")+26,zeile.length()) + "\n";

  }

}

if(truncate) {

  logfile = logfile + "\nLogfile was truncated after 200 lines";

}

context.setProperty("logfile", logfile);

**********************************************************

und dieser Mailaktion:

**********************************************************

Generierung startete um $CMS_VALUE(#context.task.scheduleEntry.runningEntries.get(0).startTime.format("H:mm:ss"))$ und dauerte $CMS_SET(duration,#context.task.scheduleEntry.runningEntries.get(0).state.taskResults.get(0).finishTime.milliseconds - #context.task.scheduleEntry.runningEntries.get(0).state.taskResults.get(0).startTime.milliseconds)$$CMS_IF(duration/3600000 > 0)$$CMS_VALUE(duration/3600000)$ h: $CMS_END_IF$$CMS_VALUE((duration%3600000)/60000)$ min: $CMS_VALUE(((duration%3600000)%60000)/1000)$ s: $CMS_VALUE(((duration%3600000)%60000)%1000)$ ms

Es wurden insgesamt $CMS_VALUE(#context.getTask().getScheduleEntry().getRunningEntries().get(0).getState().getTaskResults().get(0).getTaskInfoBean().getPageIndex())$ Seiten erzeugt.

Hierbei kam es zu

$CMS_VALUE(#context.getTask().getScheduleEntry().getRunningEntries().get(0).getState().getTaskResults().get(0).getFatalErrorCount())$ FATAL,

$CMS_VALUE(#context.getTask().getScheduleEntry().getRunningEntries().get(0).getState().getTaskResults().get(0).getErrorCount() )$ ERROR,

$CMS_VALUE(#context.getTask().getScheduleEntry().getRunningEntries().get(0).getState().getTaskResults().get(0).getWarningCount() )$ WARN

Meldungen.

$CMS_IF(#context.getTask().getScheduleEntry().getRunningEntries().get(0).getState().getTaskResults().get(0).getState().toString() == "SUCCESS")$

Generierung erfolgreich

$CMS_ELSE$

Bei der Generierung gab es folgende Fehler:

$CMS_VALUE(#context.getProperty("logfile"))$

$CMS_END_IF$

**********************************************************

wird eine ähnliche Mail verschickt wie unter 3.1er Zeiten.

Vielen Dank. Das Skript funktioniert super.

Eine kleine Korrektur. In der Mailaktion fehlte ein toString() bei der Überprüfung auf "SUCCESS":

$CMS_IF(#context.getTask().getScheduleEntry().getRunningEntries().get(0).getState().getTaskResults().get(0).getState().toString() == "SUCCESS")$

Hab ich (ungeprüft Smiley Wink) korrigiert.

Das Skript ist super, danke. Ein Problem in meinem Fall ist aber, dass ich gerne noch das komplette Log der ersten Action an die Mail hängen würde. Dafür nutze ich die Funktion "Attach log files". Die hängt dann leider auch ein (nahezu leeres) Log des Skripts an.

Gibts auch eine Möglichkeit, nur das Logfile der ersten Action anzuhängen?

Danke & Gruss

Michel

Hallo zusammen,

das klingt alles sehr verlockend gut und wäre für mich bestimmt auch sehr hilfreich. Mein Problem liegt nur darin, daß ich mich leider mit PHP zu wenig auskenne und obendrein ein FirstSpirit Newbie bin, so daß ich gar nicht weiß, wie und wo ich es einbinden könnte.

Gibt es dazu auch eine Anleitung?

Grüße

Bettina

Das ist kein PHP, sondern Beanshell-Code. Beanshell ist ziemlich ähnlich zu Java. Da Java eine der verbreitetsten Programmiersprachen ist, finden sich im Netz auch Unmengen an Informationen dazu.

Gibt es irgendwie die Möglichkeit die Email nur im Fehlerfall zu versenden?

Ja, einfach die Aktion, die die Mail verschicken soll, auf inaktiv setzen.

Beispiel (dieser Skriptcode setzt alle folgenden Aktionen auf inaktiv. Sollte so angepasst werden, dass nur die Mail Aktion inaktiv wird Smiley Wink)

idx = context.taskIndex;

tasks = context.tasks;

for (int i = idx + 1; i < tasks.size(); i++) {

    tasks.get(i).setActive(false);

}