Sync Read option in BPEL file adapter allows us to read the file from the middle of the process, this is different from the Read option which polls for the new files and is the start of the BPEL process.
As we design the file adapter for sync read it asks for the file name whcih is static, this means that only file with this given name will be read. Now suppose if we need to read files having same format but different names. How are we going to do that?
I found this question posted on the oracle forums http://forums.oracle.com/forums/thread.jspa?threadID=935976&start=0&tstart=0 that is when I worked on it and found the solution.
There's a simple way to do this. Whenever we create an adapter a fileAadapterOutboundHeader.wsdl file is created. If we open this file we'll find an inline schema having the fileName element. Below is the fileAadapterOutboundHeader.wsdl file:
<definitions
name="fileAdapter"
targetNamespace="http://xmlns.oracle.com/pcbpel/adapter/file/"
xmlns:tns="http://xmlns.oracle.com/pcbpel/adapter/file/"
xmlns="http://schemas.xmlsoap.org/wsdl/" >
<types>
<schema attributeFormDefault="qualified" elementFormDefault="qualified"
targetNamespace="http://xmlns.oracle.com/pcbpel/adapter/file/"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:FILEAPP="http://xmlns.oracle.com/pcbpel/adapter/file/">
<element name="OutboundFileHeaderType">
<complexType>
<sequence>
<element name="fileName" type="string"/>
</sequence>
</complexType>
</element>
</schema>
</types>
<!-- Header Message -->
<message name="OutboundHeader_msg">
<part element="tns:OutboundFileHeaderType" name="outboundHeader"/>
</message>
</definitions>
While invoking the adapter we only need to set this fileName element with some dynamic generated value. Below are the steps to do this:
- Double click the invoke activity which invokes the sync read adapter.
- Go to adapters tab and click the torch icon.
- Click on Variables and create a new variable.
- Give some name like OutboundheaderVariable, choose message type and click the torch.
- Drill down to fileAadapterOutboundHeader.wsdl > Message Types and select OutboundHeader_msg. Click Ok till you are back in the diagram.
- Place an assign activity above this invoke and copy the file name to the OutboundHeaderVariable > fileName variable.
That's it.
Now we can give the name of the file at runtime as the input parameter or we can define deployment descriptor to give the file name.
We can also set the input/output directory at runtime which I'll write in my next post.