Tips & Tricks - Monitor a directory

This post will show you how you can monitor a directory on the server with Intrexx. For this to function correctly, all relevant users need write access to the directory.

Create an application

Create a new application with the template Empty application in the Applications module. Rename the application to Directory Monitor. Open the properties dialog for the data group and create the following fields under the "Data fields" tab:

  • Title (Data type: Short text)

  • File (Data type: File)

The edit page can be deleted, as it is not needed. Now we'll add a View table to the overview page (All Entries), the table will list all of the records of the data groups and display both fields.

Save the application.

Create process

Create a new process with the title Directory Monitor in the Processes module.

Create a Generic event source. Give it the title "Add to c:/temp". The directory, which will be used in the following, must be on the server. On the second page of the properties window you can select the necessary Java class, which defines the event source:

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

The following properties should be added in the lower area of the window:

  • watchCreate (Boolean): true

  • watchedDirectory (String): <Name of the monitored directory>, e.g. c:\temp

Click on "OK". Then copy the GUID of the generic event source, this can be found by selecting the generic event source and pressing F4. To do that the expert options need to be enabled. Now add a Generic event handler and give it the title "Intercept event from source". Again, on the second page of the properties window you need to select a Java class and add properties.

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

  • handleWatchDirectoryCreateEvent: true

  • eventSourceGuid: The copied GUID of the generic event source is entered here. This communicates to the event handler that it should only respond to create-events from this source.

Now the newly added files must be saved in an Intrexx data record. To do this the file information is needed, which can be read with a Groovy action that is attached to the generic event handler. Give the Groovy script action the title "Write file information in processing context". Insert the following script.

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 the first two lines the file name and the monitored directory will be picked out. A new Groovy file will be created, which then – along with the file name – will be written in the processing context. In the final step, a Data group action will be created, which will add the new record. Give it the name "Create file data record" . Select the Add data record action; as the target data group, select the data group from the "Monitor directory" application. On the field assignment page the previously saved values must be called out of the processing context again.

To do that, click on "User-defined value".

Select the option "System value" here. Then click on "Edit system value".

As the type, select "Processing context". In the "Value" field enter the variable, which stands for the file name in the Groovy action script – in our example "myFileName". Confirm the changes with OK and map the value "myFileName" to the "Title" field. With the same method, create the system value "myFile" and map it to the "File" field.

With this mapping, the file is copied meaning it is not removed from the directory. If the file should be removed from the directory after it has been uploaded to the Intrexx file field, this can be achieved with another, subsequent Groovy action. The process is now finished and can be saved. You can test it by adding a file to the monitored directory and checking whether the file is listed in the application.

Comment

When creating processes that use a FileSystemWorkflowEventSource, it is important to understand when events are triggered. Especially when files are processed at the place of storage using programs, it is essential to take the way they work into account. For example, files may be created temporarily and deleted again, or files may be deleted and rewritten, etc.

Problem:

Windows no longer sends events when the server is restarted, for example.

Solution:

Intrexx has no influence on this. This is an error of the operating system.

To avoid possible execution errors, an auxiliary process can be created that automatically disables and then re-enables the process.

Problem:

Monitor directory and Import PDF do not work. The problem is that some imported files have a file size of 0 and cannot be opened.

Solution:

It is important that the files not be created in the monitored directory, but that they be created first, and only then moved or copied to the directory.

If this condition is not met, the process may see only an incomplete or empty file. It is also possible for the file rights in the system or the duration of the "external" copy process to play a role. In the latter case you can work with delays (dispatchDelay).