Tuesday, September 6, 2011

Fault handling in File adapter for CSV and XML files in SOA 11G

Hi All,

I will show how we can implement fault handling in file adapter when it is reading (polling) CSV files, I am using 11G and using its Fault Handling Framework.

This is a 2 step process,

1.) In the first step process we have a composite which is polling for CSV file's, if the file is bad then it's using fault-policies to do the required fault handling.

2.) The second step is creating a new composite which will exclusively catch the error details from the first process and log it (I have skipped the logging portion).

Step 1.) Create fault policies in composite which will poll for the .csv file.

This is how our composite looks.



This is the CSV file which I have used to configure the file adapter.

Employee.csv file
Name ID Age
yatan 101 29
yagya 102 27
yugansh 103 24

This is the XSD file which got created from the native format builder of file adapter.
Employee.xsd (Created from Jdev file adapter native format builder)



This is the contents inside the .jca file which shows the configuration details of this file adapter.



I have wired this File adapter with a BPEL process "ReadCSVBPEL". While creating this BPEL process I have given template as "Defile service later", inside the BPEL process I have used a receive activity to receive the data.



This is the Configuration inside the receive activity



The most important part is Fault Handling here, if the .csv file we are polling for is a bad file, i.e. empty file or not schema compliant then we should be notified about this.

The issue with file adapter is, if the file you are polling for is bad file it will simply rejected and the instance wont get created, this is not good as no one would ever know what happened to the files and where are they going.

I will show here fault-policies.xml and fault-bindings.xml
fault-bindings.xml



There are 2 places highlighted in red.

1.) name="rjm:ReadCSV", where is this coming from, This is the end point of the service, in the Oracle Developer Guide its little confusing as they have written here , the service end point is file adapter name here.


2.) This is actually the details of the composite which is exclusively doing the fault handling for file adapters. I will again describe this is detail.

Next file is fault-bindings.xml.

fault-bindings.xml


Now inside this file there are again 2 value highlighted in red, where is this value coming from,

1.) faultPolicy="RejectedMessages", this is value for our fault-policy id.
2.) ReadCSV, this is end point for the service.

Step 2.) We have design a new composite which will be used for catching the faults thrown by other composite which we have designed in Step 1.
The input for this service will be this type,
RejectedMessages.xsd



You can skip the below 5 steps by simply using this file.




1.) Create a new composite "FileFaultHandling" and put RejectedMessages.xsd after that drop a web service adapter to the exposed service area name it "RejectedMessageService" and on the WSDL URL use "Generate WSDL from Schema".



2.) Configure the WSDL file use the same namespace as used in RejectedMessages.xsd after that click on Add a new message part



3.) Use RejectedMessage as URL.



4.)


5.)



6.) Drop a new BPEL process with template as "Define service later", and wire the RejectedMessageService web service adapter with this BPEL process.



7.) Inside the BPEL process use a receive activity and configure it with the RejectedMessage service.

8.) Deploy the service and go to the EM to get its URL.

I told that I will describe in details about a URL in fault-policies.xml
inside fault-policies.xml.
This is the format
format - Absolute WSDL|service name|port name
WSDL of the FileFaultHandling service
Service name (This is the end point of this service)
portname (this is the port name of that service again)

Deploy 1st service and test.

I will keep "TestCSVFile2.csv" file at this location "C:\Files\CSVRead" and will simply write some junk data inside it, example aaaa, as this is not schema compliant it will get rejected and will call our FileFaultHandling service and will pass the data there.







Remember, this rejection message handler will not do complete fault handling, this is only going to reject empty files, files with some junk data or incorrect data on first line.

If we were reading a XML file then the file adapter will reject any file which is not schema compliant, the XML file will be thoroughly checked, however this is not in the case of CSV files where only empty/junk data files will be rejected, all the non schema compliant csv files will not be rejected by file adapter,so we have to do more work for fault handling when we are dealing with CSV files.