L'obiettivo di questo plugin è quello di notificare le persone responsabili via email in caso di problemi nei processi in Camunda.
Qaundo un errore accade, i dati vengono salvati in una lista (guarda BufferingIncidentHandler.handleIncident
).
Regolarmente (esempio, ogni cinque minuti), un codice controlla se ci sono o meno errori in quella lista.
Nel caso ci fossero errori, degli e-mail verranno spediti con l'informazione riguardante l'errore.
Gli indirizzi email vengono definiti in variabili di processo nei file BPMN. Apri sample-process.bpmn per avere un esempio.
Variabili di processo
incidentNotificationReceiver
eincidentNotificationCc
Indica gli indirizzi del destinatario e di chi deve ricevere la mail per conoscenza.
L'implementazione del Service task Set up incident listener
può essere impostato ad un Java Delegate vuoto
SetupIncidentListener.
Se gli indirizzi dei destinatari non venissero indicati nel diagramma BPM, verrano utilizzati degli indirizzi impostabili nella configurazione (file bpm-platform.xml
) del plugin.
Trova la versione di Camunda del sistema che vuoi targetizzare (sistema dove vuoi integrare il listener).
Clona questa repo
Controlla la versione di Camunda (proprietà camunda.version
) nel pom.xml:
<properties>
<java.version>1.8</java.version>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
<camunda.version>7.14.0</camunda.version>
</properties>
Se la versione combacia la versione individuata nel primo passo, continua col passo successivo. Altrimenti devi adattare la proprietà camunda.version
nel pom.xml
del Incident Listener.
Costruisci il JAR usando mvn clean package
. Questo creerà il file incident-listener-1.0.0-jar-with-dependencies.jar
nella cartella
target
.
Metti il JAR dello step 4 nella cartella lib
del tuo Tomcat
(e. g. camunda/apache-tomcat-9.0.37/lib
).
Apri il file di configurazione bpm-platform.xml
(e. g.
camunda/apache-tomcat-9.0.37/conf/bpm-platform.xml
).
Aggiungi una configurazione per il plugin nel file come segue:
<plugin>
<class>at.jit.incidentlistener.CustomIncidentHandlerPlugin</class>
<properties>
<property name="intervalMs">300000</property>
<property name="url">https://myserver.com/camunda</property>
<property name="fallbackMailReceiver">[email protected],[email protected]</property>
<property name="username">MyUserName</property>
<property name="password">XXXXXXXXXXXXX</property>
<property name="subject">Incident Report Camunda</property>
<property name="host">mailserver-host</property>
<property name="port">587</property>
<property name="mailSender">[email protected]</property>
<property name="mailBodyTemplate">An error occured in at least one of your processes!
Please check the following processes in your Camunda Cockpit:
@INCIDENTS
******************** AUTOMATED MESSAGE ********************
</property>
<property name="incidentTemplate">Process Activity: @ACTIVITY
Process Instance ID: @PROCESS_INSTANCE_ID
Incident Message: @MESSAGE
Incident Type: @INCIDENT_TYPE
Time of Occurrence: @TIME
Link to Process Instance: @URL
</property>
</properties>
</plugin>
Le singole impostazioni vengono descritte di seguito.
Intervallo in millisecondi ogni quanto il listener controlla per errori da mandare gli avvisi.
Se intervalMs
é uguale a 1 minuto (60000 millisecondi), le mail verranno spedite al massimo ogni minuto (nel caso ci fossero errori da riportare).
Ovviamente se ci sono processi nei quali si sono verificati degli errori.
Nel caso in cui il parametro intervalMs
venisse impostato a 5 minutei (300000 millisecondi) ed
errori accadono ogni secondo, le mail verranno comunque spedite ogni 5 minuti.
La quantità di email spedie ogni volta dipende, a parte da intervalMs
e la presenza di nuovi errori,
anche da quanti indirizzi e CC sono stati impostati.
Immagina,
- i processi sono configurati che tutti gli errori mandano un email a
[email protected]
, - gli errori accadono ogni secondo, e
intervalMs
è impostato a 5 minuti (300000
millisecondi).
In questo caso, una mail verrà spedita a [email protected]
ogni 5 minuti.
Ora immagina che in alcuni processi il destinatario della mail è impostato a [email protected]
, e in
CC -- [email protected]
.
Alle stesse condizioni di prima per quanto riguarda il resto, con questi destinatari, verranno spedite
al massimo 2 email ogni volta (uno a [email protected]
, uno a
[email protected]
).
Intervallo in millisecondi.
È la URL del cockpit di Camunda, quindi del sistema Camunda targetizzato dal listener.. È utilizzato per connettersi con la pagina degli incidenti di Camunda.
Un elenco di email separati da una virgola ai quali le mail vengono spedite in caso di errori/incidenti, se non ne sono stati configurati nel file BPMN del processo in cui l'errore è accaduto.
Nome utente del servizio di posta elettronica (SMTP).
Password per accedere alla posta elettronica del mittente. (SMTP)
L'oggetto della mail che viene spedita con l'errore.
Indirizzo del server mail (SMTP).
Porta del server mail (SMTP) per la spedizione.
Mittente della mail che viene spedita con l'errore. Campo From
della mail.
Template per il testo della mail. Il placeholder
@INCIDENTS
indica il posto dove l'informazione riguardante il singolo errore verrà inserito.
Ogni errore verrà inserito come specificato nel parametro incidentTemplate
.
Template per ogni singolo errore. Ogni errore per in una mail verrà inserito come specificato nel template.
Poi, tutti gli errori costruiti vengono concatenati ed inseriti nel placeholder @INCIDENTS
del mailBodyTemplate
.
Quando il file di configurazione è stato salvato, riavvia Tomcat usando gli script shutdown.sh
e poi startup.sh
.
Installa Docker.
Crea un file bat (per Windows) run.bat
con il seguente:
docker run -d ^
-p 8080:8080 ^
-v <directory-1>/incident-listener-demo-app-1.0-SNAPSHOT.war:/camunda/webapps/incident-listener-demo-app.war ^
-v <directory-2>/incident-listener-1.0.0-jar-with-dependencies.jar:/camunda/lib/incident-listener-plugin.jar ^
-v <directory-3>/bpm-platform.xml:/camunda/conf/bpm-platform.xml ^
camunda/camunda-bpm-platform:tomcat-7.14.0
<directory-1>
, <directory-2>
, e <directory-3>
sono le cartelle con la sorgente dell'applicazione demo,
il codice del plugin Incident Listenerthe, ed il file di configurazione rispettivamente. Sotto verrà spiegato cosa inserire in
ognuna di queste cartelle.
Qua si trova un esempio reale del file:
docker run -d ^
-p 8080:8080 ^
-v C:/usr/dp/dev/incident-listener-demo-app/target/incident-listener-demo-app-1.0-SNAPSHOT.war:/camunda/webapps/incident-listener-demo-app.war ^
-v C:/usr/dp/dev/incident-listener-a1/target/incident-listener-1.0.0-jar-with-dependencies.jar:/camunda/lib/incident-listener-plugin.jar ^
-v C:/usr/dp/dev/incident-listener-example-tomcat/bpm-platform.xml:/camunda/conf/bpm-platform.xml ^
camunda/camunda-bpm-platform:tomcat-7.14.0
Clona il progetto dell'applicazione demo dalla repository nella cartella
<directory-1>
.
Nel file BPMN incident-listener-tomcat-app/src/main/resources/sample-process.bpmn
, nell'attività Set up incident listener
,
cambia il valore del parametro in output incidentNotificationReceiver
e incidentNotificationCc
con i rispettivi valori.
Poi esegui mvn install
.
Esegui la build del plugin Incident Listener nella cartella <directory-2>
usando mvn clean package
.
Copia il file bpm-platform-template.xml nella <directory-3>
e rinominalo in
bpm-platform.xml
. Apri il file in un editor e spostati nella sezione in cui il listener è configurato.
Imposta la url
a http://localhost:8080/camunda
e poi cambia le altre proprietà
Cambia le proprietà
intervalMs
,fallbackMailReceiver
,username
,password
,host
,port
, emailSender
.
Esegui il file run.bat
.
Quando il server è avviato, apri con il browser l'indirizzo http://localhost:8080/camunda. Utilizza le credenzali demo
/demo
per autenticarti.
Avvia il processo Test Incident Listener
nella task list. Dovresti già ricevere un email con l'errore dopo l'intervallo di tempo indicato in intervalMs
.
Esegui la build del plugin Incident Listener con mvn clean install
.
Aggiungi la dipendenza al plugin Incident Listener al pom.xml
del tu progetto Spring Boot.
<dependency>
<groupId>at.jit</groupId>
<artifactId>incident-listener</artifactId>
<version>1.0.0</version>
</dependency>
Aggiungi le impostazioni relative al plugin in src/main/resources/application.yaml
come segue:
camunda.bpm:
admin-user:
id: demo
password: demo
firstName: Demo
filter:
create: All tasks
incident-listener:
intervalMs: 1000
url: http://localhost:8080/camunda
fallbackMailReceiver: TODO
username: TODO
password: TODO
host: TODO
port: TODO
mailSender: TODO
subject: Incident Report Camunda
mailBodyTemplate: |
An error occured in at least one of your processes!
Please check the following processes in your Camunda Cockpit:
@INCIDENTS
******************** AUTOMATED MESSAGE ********************
incidentTemplate: |
Process Activity: @ACTIVITY
Process Instance ID: @PROCESS_INSTANCE_ID
Incident Message: @MESSAGE
Incident Type: @INCIDENT_TYPE
Time of Occurrence: @TIME
Link to Process Instance: @URL
Sostituisci i TODO
con i valori effettivi delle rispettive proprietà.
Crea una classe con l'annotazione org.springframework.context.annotation.Configuration
. Inserisci in questa classe
la dipendenza (Con CDI) dei valori definiti in application.yaml
. Finalmente, aggiungi un metodo che crea un istanza
del listener e che lo inizializza con i valori caricati da application.yaml
.
Alla fine la classe sarà come segue:
import at.jit.incidentlistener.CustomIncidentHandlerPlugin;
import org.camunda.bpm.engine.impl.cfg.ProcessEnginePlugin;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class IncidentListenerConfig {
@Value("${incident-listener.intervalMs}")
private String intervalMs;
@Value("${incident-listener.url}")
private String url;
@Value("${incident-listener.fallbackMailReceiver}")
private String fallbackMailReceiver;
@Value("${incident-listener.username}")
private String username;
@Value("${incident-listener.password}")
private String password;
@Value("${incident-listener.host}")
private String host;
@Value("${incident-listener.port}")
private String port;
@Value("${incident-listener.mailSender}")
private String mailSender;
@Value("${incident-listener.mailBodyTemplate}")
private String mailBodyTemplate;
@Value("${incident-listener.incidentTemplate}")
private String incidentTemplate;
@Value("${incident-listener.subject}")
private String subject;
@Bean
public ProcessEnginePlugin createIncidentListenerPlugin() {
final CustomIncidentHandlerPlugin plugin = new CustomIncidentHandlerPlugin();
plugin.setIntervalMs(intervalMs);
plugin.setUrl(url);
plugin.setFallbackMailReceiver(fallbackMailReceiver);
plugin.setUsername(username);
plugin.setPassword(password);
plugin.setHost(host);
plugin.setPort(port);
plugin.setMailSender(mailSender);
plugin.setMailBodyTemplate(mailBodyTemplate);
plugin.setIncidentTemplate(incidentTemplate);
plugin.setSubject(subject);
return plugin;
}
}
Avvia l'applicazione. Ora riceverai via email gli errori dei processi.
Puoi usare l'applicazione demo incident-listener-spring-boot-demo. Essa ha due tag:
Initial_Version
è la versione dell'applicazione senza il pluginIncident_Listener_Works
è la versione con il plugin incident listener parzialmente impostato. Perchè sia funzionante bisogna rinominare il filesrc/main/resources/application.yaml-template
inapplication.yaml
e sostituire iTODO
nel file con i valori effettivi. Inserisci l'indirizzo email del destinatario insrc/main/resources/sample-process.bpmn
(attivitàSet up incident listener
, tabInput/Output
, pannelloOutput
). Successivamente puoi avviare l'applicazione Spring Boot ed il listener si avvia in automatico con esso.
Ho un processo con molteplici attività chiamate. Come posso definire il destinatario solo una volta?
Per assicurare che le proprietàd del Incident Listener vengano passate ai sotto processi, aggiungi le mappature nella sezione Variables
del Camunda Modeler. Ci devono essere 2 In Mappings
per incidentNotificationReceiver
e
incidentNotificationCc
. In entrambi i casi, devi utilizzare la seguente coinfigurazione:
Type
:Source
Source
eTarget
devono valere il nome delle rispettive variabili (incidentNotificationReceiver
eincidentNotificationCc
).
Puoi trovare un esempio nel subprocess_example_parent.bpmn. Puoi anche vederlo in azione nel esempio con Spring Boot. Per far ciô,
- apri subprocess_example_parent.bpmn,
- nell'attività
Set up incident listener
cambia la variabileincidentNotificationReceiver
eincidentNotificationCc
in indirizzi mail effettivi, - avvia l'applicazione, e
- avvia il processo
Subprocess Example (Parent)
nella task list.
1.0.0
: Initial version.
- Dmitrii Pisarenko
- Miguel De los Santos La Paz
"J-IT" IT-Dienstleistungs GesmbH
Vorgartenstraße 206B
5th floor
A-1020 Vienna
Austria