Sample 271: File Processing
Note that WSO2 EI is shipped with the following changes to what is mentioned in this documentation:
<PRODUCT_HOME>/
repository/samples/
directory that includes all Integration profile samples is changed to<EI_HOME>/
samples/service-bus/
.<PRODUCT_HOME>/
repository/samples/resources/
directory that includes all artifacts related to the Integration profile samples is changed to<EI_HOME>/
samples/service-bus/resources/
.
Introduction
This sample demonstrates how to pick a file from a directory and process it within the ESB. In this sample scenario you pick a file from the local directory, insert the records in the file to a database, send an email with the file content, trace and write the log and finally move the file to another directory.
The following diagram displays the entities involved in this example.
Note
This example works with the MySQL database.
Building the sample
All files required for this sample are in sample.zip.
Follow the steps given below to build this sample.
Set up the database
- Manually set up the database.
Create a table named
info
in your schema. You can run the following commands to do this.delimiter $$ CREATE TABLE `info` ( `name` varchar(45) DEFAULT '', `surname` varchar(45) DEFAULT NULL, `phone` varchar(45) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
Make sure the
info
table is created and that it contains the following columns:- name
- surname
- phone
The result of the query should be as follows when you query to view the records in the test.info
table. You will see that there is no data in the table.
Create the main and fault sequences
- Find the
main.xml
andfault.xml
files in the attachedsample.zip
archive. You can find the files in the<SAMPLE_HOME>/conf/synapse-config/sequences
directory. Copy the files to
<ESB_HOME>/repository/deployment/server/synapse-configs/default/sequences
folder.Note
The
main
andfault
sequences are created and preconfigured automatically when you install WSO2 ESB.
Configure the ESB
You need to configure the ESB to use the VFS transport for processing the files, and the MailTo transport for sending the email message. You also need to configure the message formatter as specified.
Edit the
<ESB_HOME>/repository/conf/axis2/axis2.xml
file and uncomment the VFS listener and the VFS sender as follows:<transportreceiver name="vfs" class="org.apache.synapse.transport.vfs.VFSTransportListener"/> ... <transportSender name="vfs" class="org.apache.synapse.transport.vfs.VFSTransportSender"/>
Edit the
<ESB_HOME>/repository/conf/axis2/axis2.xml
file and configure the mailto transport sender as follows to use a mailbox for sending the messages:<transportSender name="mailto" class="org.apache.axis2.transport.mail.MailTransportSender"> <parameter name="mail.smtp.host">smtp.gmail.com</parameter> <parameter name="mail.smtp.port">587</parameter> <parameter name="mail.smtp.starttls.enable">true</parameter> <parameter name="mail.smtp.auth">true</parameter> <parameter name="mail.smtp.user">username</parameter> <parameter name="mail.smtp.password">userpassword</parameter> <parameter name="mail.smtp.from">username@gmail.com</parameter> </transportSender>
Note
In this sample, you will not retrieve mails from a mailbox. Therefore, you do not need to enable the mailto transport receiver.
Add the following message formatter in the
<ESB_HOME>/repository/conf/Axis2/axis2.xml
file under theMessage Formatters
section:<messageFormatter contentType="text/html" class="org.apache.axis2.transport.http.ApplicationXMLFormatter"/>
Add database drivers
- Find the MySQL database driver
mysql-connector-java-5.1.10-bin.jar
in the attachedsample.zip
archive. You can find the file in the<SAMPLE_HOME>/lib
directory. - Copy the driver to the
<WSO2ESB_HOME>/repository/components/lib
directory.
Add smooks libraries
This example uses a CSV smooks library.
- You can find the CSV smooks library
milyn-smooks-csv-1.2.4.jar
in the attachedsample.zip
archive. You can find the file in the<SAMPLE_HOME>/lib
directory. Copy the library to the
<WSO2ESB_HOME>/repository/components/lib
directory.Note
These configuration changes make system-wide changes to the ESB and the ESB has to be restarted for these changes to take effect.
Configure a local entry as follows. For information on how to add a local entry, see this link. This local entry will be used to refer to the smooks configuration saved in the
<SAMPLE_HOME>/resources/smooks-config.xml
file.<localEntry key="smooks" src="file:resources/smooks-config.xml"/>
Create and configure FileProxy
You can find the
FileProxy.xml
file in the attachedsample.zip
archive. It is located in the<SAMPLE_HOME>/conf/synapse-config/proxy-services
directory.
The XML code of the sequence is as follows:<proxy xmlns="http://ws.apache.org/ns/synapse" name="FileProxy" transports="vfs" startOnLoad="true" trace="disable"> <target> <inSequence> <log level="full"/> <clone> <target sequence="fileWriteSequence"/> <target sequence="sendMailSequence"/> <target sequence="databaseSequence"/> </clone> </inSequence> </target> <parameter name="transport.vfs.ActionAfterProcess">MOVE</parameter> <parameter name="transport.PollInterval">15</parameter> <parameter name="transport.vfs.MoveAfterProcess">file:///home/username/test/original</parameter> <parameter name="transport.vfs.FileURI">file:///home/username/test/in</parameter> <parameter name="transport.vfs.MoveAfterFailure">file:///home/username/test/failure</parameter> <parameter name="transport.vfs.FileNamePattern">.*.txt</parameter> <parameter name="transport.vfs.ContentType">text/plain</parameter> <parameter name="transport.vfs.ActionAfterFailure">MOVE</parameter> </proxy>
Edit the FileProxy.xml file, and define the directory to which the original file should be moved after processing.
<parameter name="transport.vfs.MoveAfterProcess">[file:///home/]<username>/test/original</parameter>
Edit the FileProxy.xml file, and define where the input file should be placed.
<parameter name="transport.vfs.FileURI">[file:///home/]<username>/test/in</parameter>
Edit the FileProxy.xml file, and define the directory to which the file should be moved if an error occurs.
<parameter name="transport.vfs.MoveAfterFailure">[file:///home/]<username>/test/failure</parameter>
- Save the FileProxy.xml file to the
<ESB_HOME>/repository/deployment/server/synapse-configs/default/proxy-services
directory.
Create and configure databaseSequence
Follow the instructions below to create a sequence that can be used to connect to the database to insert the data.
You can find the
databaseSequence.xml
file in the attachedsample.zip
archive. It is located in the<SAMPLE_HOME>/conf/synapse-config/sequences
directory.
The XML code of the database sequence is as follows.<sequence xmlns="http://ws.apache.org/ns/synapse" name="databaseSequence"> <log level="full"> <property name="sequence" value="before-smooks"/> </log> <smooks config-key="smooks"> <input type="text"/> <output type="xml"/> </smooks> <log level="full"> <property name="sequence" value="after-smooks"/> </log> <iterate xmlns:ns2="http://org.apache.synapse/xsd" xmlns:ns="http://org.apache.synapse/xsd" xmlns:sec="http://secservice.samples.esb.wso2.org" expression="//csv-records/csv-record"> <target> <sequence> <dbreport> <connection> <pool> <password>db-password</password> <user>db-username</user> <url>jdbc:mysql://localhost:3306/test</url> <driver>com.mysql.jdbc.Driver</driver> </pool> </connection> <statement> <sql>insert into info values (?, ?, ?)</sql> <parameter expression="//csv-record/name/text()" type="VARCHAR"/> <parameter expression="//csv-record/surname/text()" type="VARCHAR"/> <parameter expression="//csv-record/phone/text()" type="VARCHAR"/> </statement> </dbreport> </sequence> </target> </iterate> </sequence>
- Specify your database username, password, and URL in the
<pool>
section of the sequence. - Save the
databaseSequence.xml
file to the<ESB_HOME>/repository/deployment/server/synapse-configs/default/sequences
directory.
Create and Configure fileWriteSequence
You can find the
fileWriteSequence.xml
in the attachedsample.zip
archive. It is located in the<SAMPLE_HOME>/conf/synapse-config/sequences
directory.
The XML code of the sequence is as follows:<sequence xmlns="http://ws.apache.org/ns/synapse" name="fileWriteSequence"> <log level="custom"> <property name="sequence" value="fileWriteSequence"/> </log> <property xmlns:ns2="http://org.apache.synapse/xsd" name="transport.vfs.ReplyFileName" expression="fn:concat(fn:substring-after(get-property('MessageID'), 'urn:uuid:'), '.txt')" scope="transport"/> <property name="OUT_ONLY" value="true"/> <send> <endpoint name="FileEpr"> <address uri="vfs:file:///home/username/test/out"/> </endpoint> </send> </sequence>
Edit the
fileWriteSequence.xml
file, and define the directory to which the file should be moved.- Save the
fileWriteSequence.xml
file to the<ESB_HOME>/repository/deployment/server/synapse-configs/default/sequences
directory.
Create and configure sendMailSequence
You can find the
sendMailSequence.xml
file in the attachedsample.zip
archive. It is located in the<SAMPLE_HOME>/conf/synapse-config/sequences
directory.
The XML code of the sequence is as follows:<sequence xmlns="http://ws.apache.org/ns/synapse" name="sendMailSequence"> <log level="custom"> <property name="sequence" value="sendMailSequence"/> </log> <property name="messageType" value="text/html" scope="axis2"/> <property name="ContentType" value="text/html" scope="axis2"/> <property name="Subject" value="File Received" scope="transport"/> <property name="OUT_ONLY" value="true"/> <send> <endpoint name="FileEpr"> <address uri="mailto:username@gmail.com"/> </endpoint> </send> </sequence>
- Edit the
sendMailSequence.xml
file, and define the e-mail address to which the notification should be sent. - Save the
sendMailSequence.xml
file to the<ESB_HOME>/repository/deployment/server/synapse-configs/default/sequences
directory.
Create the input file
Create a text file in the following format.
name_1, surname_1, phone_1 name_2, surname_2, phone_2
Executing the sample
- Save the file in the
.txt
format to thein
directory that you specified in step 3, under the create and configureFileProxy
section.
Analyzing the output
In this sample, the ESB listens on a local file system directory. When a file is dropped into the in
directory, the ESB picks this file.
- Make sure the file appears in the
out
directory. - The ESB inserts the records from the text file to the database. Make sure the data is in the info table. The following screenshot displays the content of the
test.info
table with the data from the file.
- Make sure the original file is moved to the
/home/<username>/test/original
directory. Make sure the e-mail notification is sent to the email address that is specified. The message should contain the file data. The following screenshot displays a notification received.