add cleanup lock ram function an activate
This commit is contained in:
parent
601a0c2757
commit
bce38cda67
Binary file not shown.
|
|
@ -0,0 +1,86 @@
|
||||||
|
import de.vertico.starface.module.core.model.VariableType;
|
||||||
|
import de.vertico.starface.module.core.model.Visibility;
|
||||||
|
import de.vertico.starface.module.core.runtime.IBaseExecutable;
|
||||||
|
import de.vertico.starface.module.core.runtime.IRuntimeEnvironment;
|
||||||
|
import de.vertico.starface.module.core.runtime.annotations.Function;
|
||||||
|
import de.vertico.starface.module.core.runtime.annotations.OutputVar;
|
||||||
|
|
||||||
|
import java.nio.file.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mail2FaxCleanup - Cleanup Block für Mail2Fax
|
||||||
|
*
|
||||||
|
* Dieser Block sollte beim "activate" Event des Moduls ausgeführt werden.
|
||||||
|
* Er stellt sicher, dass nach einem Server-Absturz oder Modul-Reload
|
||||||
|
* keine verwaisten Locks existieren.
|
||||||
|
*
|
||||||
|
* Hinweis: Der ReentrantLock ist ein In-Memory Lock und wird automatisch
|
||||||
|
* beim Server-Neustart freigegeben. Dieser Block ist hauptsächlich für
|
||||||
|
* Modul-Reloads ohne Server-Neustart gedacht.
|
||||||
|
*
|
||||||
|
* Für STARFACE 8.x, 9.x, 10.x (Java 21)
|
||||||
|
*/
|
||||||
|
@Function(
|
||||||
|
visibility = Visibility.Private,
|
||||||
|
description = "Cleanup für Mail2Fax - beim Modul-Start ausführen"
|
||||||
|
)
|
||||||
|
public class Mail2FaxCleanup implements IBaseExecutable {
|
||||||
|
|
||||||
|
private static final String DATA_DIR = "/var/starface/module-data";
|
||||||
|
|
||||||
|
@OutputVar(
|
||||||
|
label = "Status",
|
||||||
|
description = "Cleanup-Status-Meldung",
|
||||||
|
type = VariableType.STRING
|
||||||
|
)
|
||||||
|
public String statusMessage = "";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(IRuntimeEnvironment runtime) throws Exception {
|
||||||
|
org.apache.logging.log4j.Logger log = runtime.getLog();
|
||||||
|
|
||||||
|
try {
|
||||||
|
log.info("Mail2Fax Cleanup: Starte Cleanup");
|
||||||
|
|
||||||
|
// Datenverzeichnis prüfen
|
||||||
|
Path dataDir = Paths.get(DATA_DIR);
|
||||||
|
if (!Files.exists(dataDir)) {
|
||||||
|
log.info("Mail2Fax Cleanup: Datenverzeichnis existiert nicht, nichts zu tun");
|
||||||
|
statusMessage = "OK - Keine Daten vorhanden";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prüfe auf Tracking-Dateien
|
||||||
|
Path processedFile = Paths.get(DATA_DIR + "/mail2fax_processed.txt");
|
||||||
|
Path retryFile = Paths.get(DATA_DIR + "/mail2fax_retry.txt");
|
||||||
|
|
||||||
|
int processedCount = 0;
|
||||||
|
int retryCount = 0;
|
||||||
|
|
||||||
|
if (Files.exists(processedFile)) {
|
||||||
|
processedCount = Files.readAllLines(processedFile).size();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Files.exists(retryFile)) {
|
||||||
|
retryCount = (int) Files.lines(retryFile)
|
||||||
|
.filter(line -> !line.trim().isEmpty())
|
||||||
|
.count();
|
||||||
|
}
|
||||||
|
|
||||||
|
log.info("Mail2Fax Cleanup: " + processedCount + " verarbeitete Nachrichten, " +
|
||||||
|
retryCount + " wartende Retries");
|
||||||
|
|
||||||
|
// Der ReentrantLock ist ein In-Memory Lock und existiert nur während
|
||||||
|
// der Laufzeit. Bei einem Server-Neustart oder Modul-Reload wird eine
|
||||||
|
// neue Instanz erstellt. Es gibt keine Lock-Datei die gelöscht werden muss.
|
||||||
|
|
||||||
|
statusMessage = "OK - " + processedCount + " verarbeitete, " + retryCount + " Retries";
|
||||||
|
log.info("Mail2Fax Cleanup: Abgeschlossen");
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
String msg = "Cleanup-Fehler: " + e.getMessage();
|
||||||
|
log.error("Mail2Fax Cleanup: " + msg, e);
|
||||||
|
statusMessage = msg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -19,7 +19,8 @@ Ein Custom Block für den STARFACE Module Designer, der E-Mails abruft und PDF-A
|
||||||
|
|
||||||
```
|
```
|
||||||
v8-9-10/
|
v8-9-10/
|
||||||
├── Mail2FaxBlock.java # Quellcode des Custom Blocks
|
├── Mail2FaxBlock.java # Quellcode des Custom Blocks (Hauptfunktion)
|
||||||
|
├── Mail2FaxCleanup.java # Cleanup-Block (für activate Event)
|
||||||
├── build-block.sh # Kompilier-Script
|
├── build-block.sh # Kompilier-Script
|
||||||
├── libs/starface/ # STARFACE API JARs
|
├── libs/starface/ # STARFACE API JARs
|
||||||
└── README.md
|
└── README.md
|
||||||
|
|
@ -40,7 +41,7 @@ cd ..
|
||||||
./build-block.sh
|
./build-block.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
Ergebnis: `Mail2FaxBlock.class`
|
Ergebnis: `Mail2FaxBlock.class` und `Mail2FaxCleanup.class`
|
||||||
|
|
||||||
## Installation im Module Designer
|
## Installation im Module Designer
|
||||||
|
|
||||||
|
|
@ -49,14 +50,17 @@ Ergebnis: `Mail2FaxBlock.class`
|
||||||
- "Neues Modul erstellen"
|
- "Neues Modul erstellen"
|
||||||
- Name: "Mail2Fax"
|
- Name: "Mail2Fax"
|
||||||
|
|
||||||
### 2. Block hochladen
|
### 2. Blöcke hochladen
|
||||||
- Tab "Ressourcen"
|
- Tab "Ressourcen"
|
||||||
- "Datei hochladen" → `Mail2FaxBlock.class`
|
- "Datei hochladen" → `Mail2FaxBlock.class`
|
||||||
|
- "Datei hochladen" → `Mail2FaxCleanup.class`
|
||||||
|
|
||||||
### 3. Funktion erstellen
|
### 3. Funktionen erstellen
|
||||||
- Tab "Funktionen"
|
- Tab "Funktionen"
|
||||||
- Neue Funktion erstellen
|
- **Funktion 1**: "Mail2Fax" (Hauptfunktion)
|
||||||
- Den hochgeladenen Block als Implementierung auswählen
|
- Block: Mail2FaxBlock.class
|
||||||
|
- **Funktion 2**: "Mail2Fax Cleanup" (Cleanup)
|
||||||
|
- Block: Mail2FaxCleanup.class
|
||||||
|
|
||||||
### 4. Eingabe-Variablen konfigurieren
|
### 4. Eingabe-Variablen konfigurieren
|
||||||
|
|
||||||
|
|
@ -77,19 +81,28 @@ Ergebnis: `Mail2FaxBlock.class`
|
||||||
| maxRetries | NUMBER | Max. Wiederholungsversuche | 3 |
|
| maxRetries | NUMBER | Max. Wiederholungsversuche | 3 |
|
||||||
| retryDelayMinutes | NUMBER | Minuten zwischen Versuchen | 5 |
|
| retryDelayMinutes | NUMBER | Minuten zwischen Versuchen | 5 |
|
||||||
|
|
||||||
### 5. Timer konfigurieren
|
### 5. Entrypoint konfigurieren (Cleanup)
|
||||||
|
|
||||||
|
Damit nach einem Server-Absturz oder Modul-Reload keine Probleme auftreten:
|
||||||
|
|
||||||
|
1. Tab **"Entrypoints"** öffnen
|
||||||
|
2. Event **"activate"** auswählen
|
||||||
|
3. **Mail2Fax Cleanup** Funktion verknüpfen
|
||||||
|
|
||||||
|
Diese Funktion wird beim Modul-Start ausgeführt und stellt sicher, dass alles sauber initialisiert wird.
|
||||||
|
|
||||||
|
### 6. Timer konfigurieren (Hauptfunktion)
|
||||||
|
|
||||||
Der Block muss regelmäßig ausgeführt werden um E-Mails abzurufen. Dafür den Timer im Module Designer konfigurieren:
|
Der Block muss regelmäßig ausgeführt werden um E-Mails abzurufen. Dafür den Timer im Module Designer konfigurieren:
|
||||||
|
|
||||||
1. Tab **"Timer"** öffnen
|
1. Tab **"Timer"** öffnen
|
||||||
2. Auf **[+]** klicken um einen neuen Schedule hinzuzufügen
|
2. Auf **[+]** klicken um einen neuen Schedule hinzuzufügen
|
||||||
3. Intervall festlegen (empfohlen: alle 60 Sekunden)
|
3. Intervall festlegen (empfohlen: alle 60 Sekunden)
|
||||||
|
4. **Mail2Fax** Funktion (nicht Cleanup!) verknüpfen
|
||||||

|
|
||||||
|
|
||||||
**Hinweis:** Der Block hat einen eingebauten Lock-Mechanismus. Wenn der Timer erneut auslöst während der Block noch läuft, wird die neue Ausführung automatisch übersprungen. Keine Gefahr von Duplikaten.
|
**Hinweis:** Der Block hat einen eingebauten Lock-Mechanismus. Wenn der Timer erneut auslöst während der Block noch läuft, wird die neue Ausführung automatisch übersprungen. Keine Gefahr von Duplikaten.
|
||||||
|
|
||||||
### 6. Modul aktivieren
|
### 7. Modul aktivieren
|
||||||
|
|
||||||
## Benutzung
|
## Benutzung
|
||||||
|
|
||||||
|
|
@ -136,3 +149,18 @@ Da POP3 keine "gelesen"-Flags unterstützt, speichert der Block verarbeitete Mes
|
||||||
- `/var/starface/module-data/mail2fax_processed.txt`
|
- `/var/starface/module-data/mail2fax_processed.txt`
|
||||||
|
|
||||||
So werden Duplikate vermieden, auch wenn E-Mails nicht sofort gelöscht werden können.
|
So werden Duplikate vermieden, auch wenn E-Mails nicht sofort gelöscht werden können.
|
||||||
|
|
||||||
|
## Lock-Mechanismus und Server-Absturz
|
||||||
|
|
||||||
|
Der Block verwendet einen **In-Memory Lock** (`ReentrantLock`), um parallele Ausführungen zu verhindern.
|
||||||
|
|
||||||
|
**Wichtig zu wissen:**
|
||||||
|
- Der Lock existiert nur im RAM, nicht als Datei
|
||||||
|
- Bei einem Server-Neustart wird der Lock automatisch freigegeben
|
||||||
|
- Bei einem Absturz während der Ausführung gibt es **keine verwaiste Lock-Datei**
|
||||||
|
- Der Cleanup-Block beim `activate` Event ist hauptsächlich für Log-Ausgaben und Statusprüfung
|
||||||
|
|
||||||
|
**Was passiert bei einem Absturz während des Sendens?**
|
||||||
|
- Der Lock wird automatisch freigegeben (bei Neustart)
|
||||||
|
- PDFs in der Retry-Queue bleiben erhalten und werden beim nächsten Durchlauf erneut versucht
|
||||||
|
- Tracking-Dateien bleiben erhalten (processed.txt, retry.txt)
|
||||||
|
|
|
||||||
|
|
@ -57,21 +57,25 @@ if [ -z "$CLASSPATH" ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Kompiliere Mail2FaxBlock.java..."
|
echo "Kompiliere Mail2FaxBlock.java..."
|
||||||
|
|
||||||
# Kompilieren - wichtig: nur die .class Datei, kein Package!
|
|
||||||
javac -source 21 -target 21 \
|
javac -source 21 -target 21 \
|
||||||
-cp "$CLASSPATH" \
|
-cp "$CLASSPATH" \
|
||||||
-proc:none \
|
-proc:none \
|
||||||
Mail2FaxBlock.java
|
Mail2FaxBlock.java
|
||||||
|
|
||||||
if [ -f "Mail2FaxBlock.class" ]; then
|
echo "Kompiliere Mail2FaxCleanup.java..."
|
||||||
|
javac -source 21 -target 21 \
|
||||||
|
-cp "$CLASSPATH" \
|
||||||
|
-proc:none \
|
||||||
|
Mail2FaxCleanup.java
|
||||||
|
|
||||||
|
if [ -f "Mail2FaxBlock.class" ] && [ -f "Mail2FaxCleanup.class" ]; then
|
||||||
echo ""
|
echo ""
|
||||||
echo "========================================"
|
echo "========================================"
|
||||||
echo " Erfolgreich!"
|
echo " Erfolgreich!"
|
||||||
echo "========================================"
|
echo "========================================"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Datei: Mail2FaxBlock.class"
|
echo "Dateien:"
|
||||||
ls -lh Mail2FaxBlock.class
|
ls -lh Mail2FaxBlock.class Mail2FaxCleanup.class
|
||||||
echo ""
|
echo ""
|
||||||
echo "WICHTIG: Die JavaMail-Bibliothek muss auch auf der STARFACE sein!"
|
echo "WICHTIG: Die JavaMail-Bibliothek muss auch auf der STARFACE sein!"
|
||||||
echo "Falls Fehler auftreten, kopiere javax.mail.jar nach STARFACE:"
|
echo "Falls Fehler auftreten, kopiere javax.mail.jar nach STARFACE:"
|
||||||
|
|
@ -80,9 +84,14 @@ if [ -f "Mail2FaxBlock.class" ]; then
|
||||||
echo "Nächste Schritte:"
|
echo "Nächste Schritte:"
|
||||||
echo "1. STARFACE Admin öffnen"
|
echo "1. STARFACE Admin öffnen"
|
||||||
echo "2. Module → Module Designer → Neues Modul"
|
echo "2. Module → Module Designer → Neues Modul"
|
||||||
echo "3. Unter 'Ressourcen' die Mail2FaxBlock.class hochladen"
|
echo "3. Unter 'Ressourcen' BEIDE .class Dateien hochladen:"
|
||||||
echo "4. Neuen Funktionsbaustein erstellen und Block verknüpfen"
|
echo " - Mail2FaxBlock.class"
|
||||||
echo "5. Timer-Baustein hinzufügen für regelmäßige Ausführung"
|
echo " - Mail2FaxCleanup.class"
|
||||||
|
echo "4. Zwei Funktionsbausteine erstellen:"
|
||||||
|
echo " - Mail2FaxBlock (Hauptfunktion für Timer)"
|
||||||
|
echo " - Mail2FaxCleanup (für 'activate' Entrypoint)"
|
||||||
|
echo "5. Timer-Baustein für Mail2FaxBlock hinzufügen"
|
||||||
|
echo "6. Entrypoint 'activate' mit Mail2FaxCleanup verknüpfen"
|
||||||
echo ""
|
echo ""
|
||||||
else
|
else
|
||||||
echo "FEHLER: Kompilierung fehlgeschlagen"
|
echo "FEHLER: Kompilierung fehlgeschlagen"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue