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; } } }