Tipps & Tricks - Verzeichnis überwachen

In diesem Beitrag wird gezeigt, wie mit Intrexx ein Verzeichnis auf dem Server überwacht werden kann. Für die korrekte Funktion benötigen alle relevanten Benutzer Schreibrechte auf das Verzeichnis.

Applikation erstellen

Erstellen Sie im Modul Applikationen eine neue Applikation mit der Vorlage Leere Applikation. Geben Sie ihr den Titel Verzeichnis überwachen. Öffnen Sie den Eigenschaftendialog der Datengruppe und legen Sie dort auf dem Reiter "Datenfelder" die folgenden Felder an:

  • Titel (Typ Kurzer Text)

  • Datei (Typ Datei)

Die Eingabeseite kann gelöscht werden, sie wird nicht benötigt. Auf der Übersichtsseite wird eine Ansichtstabelle eingefügt, die alle Datensätze der Datengruppe auflistet und beide Felder anzeigt.

Speichern Sie die Applikation.

Prozess erstellen

Erstellen Sie im Modul Prozesse einen neuen Prozess mit dem Titel Verzeichnis überwachen.

Legen Sie eine Generische Ereignisquelle an. Geben Sie ihr den Titel "Einfügen in c:\temp". Das Verzeichnis, das Sie hier im Folgenden verwenden, muss auf dem Server vorhanden sein. Auf der zweiten Seite des Eigenschaftendialogs kann die Java-Klasse ausgewählt werden, die die Ereignisquelle definiert:

de.uplanet.lucy.server.workflow.eventsource.FileSystemWorkflowEventSource

Im unteren Bereich des Dialogs werden die folgenden Eigenschaften hinzugefügt:

  • watchCreate (boolean): true

  • watchedDirectory (String): <Name des zu überwachenden Verzeichnis>, z.B. c:\temp

Klicken Sie OK. Kopieren Sie dann die GUID der Generischen Ereignisquelle, die Sie mit der Taste F4 ermitteln können, wenn die generische Ereignisquelle markiert ist. Dazu müssen die Optionen für Experten aktiviert sein. Legen Sie dann einen Generischen Ereignisbehandler mit dem Titel "Ereignis aus Quelle abfangen" an. Auch beim Generischen Ereignisbehandler werden im zweiten Fenster des Eigenschaftendialogs eine Java-Klasse und Eigenschaften hinterlegt.

  • Klasse: de.uplanet.lucy.server.workflow.eventhandler.FileSystemWorkflowEventHandler

  • handleWatchDirectoryCreateEvent: true

  • eventSourceGuid: Hier wird die die kopierte GUID der generischen Ereignisquelle eingetragen. So wird dem Ereignisbehandler mitgeteilt, dass er nur auf create-Events von dieser Quelle reagieren soll.

Nun muss die neu hinzugefügte Datei noch in einem Intrexx-Datensatz gespeichert werden. Dazu werden die Dateiinformationen benötigt, die mit einer Groovy-Aktion, die an den Generischen Ereignisbehandler angehängt wird, ausgelesen werden können. Geben Sie der Groovy-Aktion den Titel "Dateiinformationen in Verarbeitungskontext schreiben". Hinterlegen Sie das hier folgende Skript.

def myFileName = g_event.getContext() 
def myDir = g_event.getWatchedDirectory() 
def myFile = new File("${myDir}/${myFileName}")
g_sharedState.myFileName = myFileName 
g_sharedState.myFile = myFile 

In den ersten beiden Zeilen werden der Dateiname und das überwachte Verzeichnis ausgelesen. In der dritten Zeile wird ein neues Groovy File-Objekt erzeugt, das dann – ebenso wie der Dateiname – in den Verarbeitungskontext geschrieben wird. Im letzten Schritt wird eine Datengruppenaktion erstellt, die den neuen Datensatz anlegt. Geben Sie ihr den Namen "Dateidatensatz anlegen" . Wählen Sie die Aktion Datensatz hinzufügen, als Zieldatengruppe die Datengruppe aus der Applikation "Verzeichnis überwachen". Bei der Feldzuordnung müssen die vorher gespeicherten Werte wieder aus dem Verarbeitungskontext geholt werden.

Klicken Sie dazu auf "Benutzerdefinierter Wert".

Wählen Sie hier die Option "Systemwert". Klicken Sie dann auf "Bearbeiten".

Wählen Sie hier als Typ "Verarbeitungskontext" aus. In "Wert" wird die Variable, die für den Dateinamen in der Groovy-Skript-Aktion steht, eingetragen - in unserem Beispiel "myFileName". Bestätigen Sie die Änderungen jeweils mit "OK" und weisen Sie den Wert "myFileName" dem Feld "Titel" zu. Erzeugen Sie mit derselben Vorgehensweise den Systemwert "myFile" und weisen Sie den Wert dem Feld "Datei" zu.

Mit dieser Zuweisung wird die Datei kopiert, sie verbleibt also auch weiterhin im Verzeichnis. Wenn die Datei nach dem Hochladen in das Intrexx-Datenfeld im Verzeichnis gelöscht werden soll, so kann dies mit einer weiteren, nachfolgenden Groovy-Aktion erledigt werden. Der Prozess ist nun abgeschlossen und kann gespeichert werden. Sie können ihn testen, indem Sie eine Datei in das überwachte Verzeichnis einfügen und überprüfen, ob die Datei in der Applikation aufgelistet wird.

Anmerkung

Beim Erstellen von Prozessen, die eine FileSystemWorkflowEventSource verwenden, muss man verstehen, wann Events ausgelöst werden. Besonders wenn Dateien am Ablageort mit Programmen verarbeitet werden, muss man deren Arbeitsweise berücksichtigen. So werden beispielsweise temporär Dateien angelegt und wieder gelöscht oder Dateien werden gelöscht und neu geschrieben etc.

Problem:

Windows schickt keine Events mehr, wenn der Server z.B. neu gestartet wird.

Lösung:

Intrexx hat darauf keinen Einfluss. Es handelt sich hier um einen Fehler des Betriebssystems.

Um eventuelle Ausführungsfehler zu vermeiden, kann ein Hilfsprozess erstellt werden, der den Prozess automatisch deaktiviert und anschließend wieder aktiviert.

Problem:

Verzeichnis überwachen und PDF importieren funktionieren nicht. Das Problem ist, dass manche importierte Dateien Dateigröße 0 haben und nicht geöffnet werden können.

Lösung:

Wichtig ist, dass die Dateien nicht im überwachten Verzeichnis erstellt werden, sondern zuerst erstellt und erst dann in das Verzeichnis verschoben oder kopiert werden.

Falls diese Voraussetzung nicht gegeben ist, kann es passieren, dass der Prozess nur eine unvollständige oder leere Datei sieht. Eventuell können auch Dateirechte im System oder die Dauer des "externen" Kopiervorgangs eine Rolle spielen. Im letzten Fall kann man mit Delays (dispatchDelay) arbeiten.