In order to generate dynamic properties SOA suite provides some properties
These are very important properties and later i will try to cover all of them.
But first of all it is very difficult to search for these properties so just to ease my work of searching here is the document
http://download.oracle.com/docs/cd/E15523_01/integration.1111/e10224/bp_app_normalprops.htm
The views expressed on this blog are my own and do not necessarily reflect the views of any Organisations owning these products.I keep on doing R & D with different products in and around Middle ware stack and these posts are result of that.Most of the post are result of my own experiments or ideas taken from other blogs .If in any case You feel content is not right you can comment to remove that post. This blog uses the default features,cookies of blogspot.com
Thursday, June 23, 2011
Monday, June 20, 2011
Sunday, June 19, 2011
Dynamic Partnerlink concept and example in SOA Suite 11g
I was thinking that this will be a difficult one but for my surprise this only sounds difficult and is most easy to implement.We have seen how to dynamically change end point in an adapter
The concept for dynamic partner link is same,As the name suggest the partnerlink will be passed at run time based on some rules or switch condition.You might have seen a sample in soa suite 10g ,Loan demo application.In this exercise we will see how we can pass partner link dynamically.
But as in case of dynamic database adapter we need to have same schema and table name in database similarly we need to have same message type in all the partnerlink.This might be clear first if we will not make the message type same,we will see what error we will get and then we will see how we can get over this issue.
You can do it simply by following link]
http://oraclefusion1011.blogspot.com/2011/03/dynamic-partner-link-in-bpel.html
The concept for dynamic partner link is same,As the name suggest the partnerlink will be passed at run time based on some rules or switch condition.You might have seen a sample in soa suite 10g ,Loan demo application.In this exercise we will see how we can pass partner link dynamically.
But as in case of dynamic database adapter we need to have same schema and table name in database similarly we need to have same message type in all the partnerlink.This might be clear first if we will not make the message type same,we will see what error we will get and then we will see how we can get over this issue.
You can do it simply by following link]
http://oraclefusion1011.blogspot.com/2011/03/dynamic-partner-link-in-bpel.html
How to create DVM in SOA Suite 11g
Domain value mapping or DVM as the name suggest ,it mean a mapping of values among different domains.
Let suppose we have two domain in our integration
One end we have finance domain and other end we have Security Domain
So there might be a case that finance domain will ask for two different fields as
Fname and Lname so if your name is Anil kumar you will put Fname as Anil and Lname as Kumar
But again we have full chance that in Secutiry domain we will not have the same concept of
Fname and Lname but instead there will be only one filed Name so how it will map the Fname and Lname to Name they must be some mapping file which i should refer to understand these things that mapping file is our Domain Value mapping.We will see how we can create a dvm and we will see how we can use it in our process.
In order to create a DVM click on your project then go to File-->New
then choose in SOA Tier-->Transforamtion on left side and DVM on right side as shown below
When you will say next it will come up with a page with two default values for dvm which i have changed in my case as per my requirement.
So once you will say ok you will get a tabular column something like this.
To make it meaningful i have defined two domain
one is code that contains the code for the Country
and other is the name of the country as you can see.
Now i will just create a simple process to show its functionality.
My simple process consist of a mediator and a file adpater as you can see below.
I am just taking an input data to initiate the process then in the mediator i am using the DVM function and then a file adapter to write the data in a file.
We can use the DVM in a xsl file.So we will create a transformation as shown in the picture.
Now once your transformation comes up.
In the component pallete Choose advanced and then choose DVM Function
There you will get two attributes
lookupValue and lookupValue1M
If you want to pass a default value also in case there is no mapping for DVM you can use lookupValue however in my case i am using lookupValue1M.
Everything should be clear from the screenshots.
I have chosen my code as IN so i should get back as result India in my file adapter.
And this is the result i got.
Let suppose we have two domain in our integration
One end we have finance domain and other end we have Security Domain
So there might be a case that finance domain will ask for two different fields as
Fname and Lname so if your name is Anil kumar you will put Fname as Anil and Lname as Kumar
But again we have full chance that in Secutiry domain we will not have the same concept of
Fname and Lname but instead there will be only one filed Name so how it will map the Fname and Lname to Name they must be some mapping file which i should refer to understand these things that mapping file is our Domain Value mapping.We will see how we can create a dvm and we will see how we can use it in our process.
In order to create a DVM click on your project then go to File-->New
then choose in SOA Tier-->Transforamtion on left side and DVM on right side as shown below
When you will say next it will come up with a page with two default values for dvm which i have changed in my case as per my requirement.
So once you will say ok you will get a tabular column something like this.
To make it meaningful i have defined two domain
one is code that contains the code for the Country
and other is the name of the country as you can see.
Now i will just create a simple process to show its functionality.
My simple process consist of a mediator and a file adpater as you can see below.
I am just taking an input data to initiate the process then in the mediator i am using the DVM function and then a file adapter to write the data in a file.
We can use the DVM in a xsl file.So we will create a transformation as shown in the picture.
Now once your transformation comes up.
In the component pallete Choose advanced and then choose DVM Function
There you will get two attributes
lookupValue and lookupValue1M
If you want to pass a default value also in case there is no mapping for DVM you can use lookupValue however in my case i am using lookupValue1M.
Everything should be clear from the screenshots.
I have chosen my code as IN so i should get back as result India in my file adapter.
And this is the result i got.
Thursday, June 16, 2011
Oracle JCA Adapter Properties in SOA suite 11g
You can find the jca adapter properties in the following document
http://download.oracle.com/docs/cd/E12839_01/integration.1111/e10231/adptr_propertys.htm#CHDEDJEA
http://download.oracle.com/docs/cd/E12839_01/integration.1111/e10231/adptr_propertys.htm#CHDEDJEA
Wednesday, June 15, 2011
How to dynamically change the end-point of adapter
In this sample exercise we will see how we can dynamically change the end point for adapter at run time.I will be depicting this feature by a simple composite process where in i will write a file in a particular folder and will change the folder location at run time.
My process will look something like this.
This is just a simple asynchronous bpel process where in i am mapping the input text to the content of file adapter and then writing it to a folder location.
first of all you can deploy and invoke this process to see if it is working fine and writing in the location specified during file adapter configuration.
Now go to em console and click on your process.
At bottom you will get Services and Reference tag.
You will find the service that you have created as can be seen.
Click on the adapter service that you have created.
Now go to properties tab of the adapter and you will get the physical directoty location that you have specified during your design time from jdeveloper.
You can change the value of physical directory over here to another location,Make sure the new location already exists and say apply.
No need to do any thing else,just test the composite process again from em console and this time the file will be written into the new location.
Though we have achieved the functionality of changing the file location at run time we still have not made it dynamic that is based on input or some other logic it should automatically goes to different folder location.We will see how we can achieve this now.
Now we will think of the approach that we can use to change the value dynamically.
Which mean we must have to refer to some table in order to map it to different directory structure.So we can use either business rules or DVm for the mapping.
But again we should have one field which should assing different values for output directory.
So first of all we will try to create a variable which can pass the value for output directory.
For this purpose i created a new variable as shown below.
Now we will see how we can use this variable to assign values.
I will drag and drop an assign activity and will pass on a location in my server where i want to write the file.Please make sure that it is within single inverted comma.
this value i will map to the variable which i have created now as can be seen.
now i need to map this value to the file Directory name.
You can know more about this proeprty from following doc
http://download.oracle.com/docs/cd/E12839_01/integration.1111/e10231/adptr_propertys.htm#CHDEDJEA
We have a property called jca.file.directory we will map our variable to this directory.
This takes precedence over the location that we have specified during the design time of adapter.
Just save this project and redeploy it to the server.
Now if you will test your service you will find that the file is now written to the new folder location that we have passed from Expression builder.
so we have got a variable also.Now it is very easy we can create our rule or dvm to assing dynamic values to this variable.We will now see how we can do that.
So now we just need to create one business rule and attach it to our composite.
I created a simple rule as shown below.
It is a simple rule which says if input in ankit send it to poll directory and when input is arpit send it to out directory.YOu can check my previous post on how to create business rules and attach it to your bpel in a composite
http://soa-bpel-esb.blogspot.com/2011/06/business-rules-ruleset-in-soa-suite.html
Now We need only one configuration we need to map the output of the rules to the variable which we have created to assign random outputDirectory so this i have done using an assign activity as you can see below.
That is it.Now deploy the process and depending upon the input it will write in different directory structure.Few common mistakes which you need to take care of if you have defined your input in rules as constant then in that case it will not work with input ankti or arpit rather you will have to use 'ankit' or 'arpit' as input.
failing to do so will give you following error.
Non Recoverable System Fault :
<bpelFault><faultType>0</faultType><operationErroredFault xmlns="http://xmlns.oracle.com/OracleRules1/OracleRules1_DecisionService_1"><part name="payload"><errorInfo xmlns="http://xmlns.oracle.com/OracleRules1/OracleRules1_DecisionService_1"><errorMessage>Fact not found in the rule engine working memory, rule session execution failed. The rule session 40567 failed because an instance of the fact com.oracle.xmlns.sample.dynamicfile.bpelprocessdynamic.ProcessResponse could not be found in the working memory of the rule session. This is most likely a rule modeling error. The decision service interaction expects the fact instance to exist in the working memory of the rule session. Check the rule actions in rule designer and make sure that a fact of the expected type is being asserted. If the error persists, contact Oracle Support Services. 40567</errorMessage></errorInfo></part></operationErroredFault></bpelFault>
So design you process carefully. :)
My process will look something like this.
This is just a simple asynchronous bpel process where in i am mapping the input text to the content of file adapter and then writing it to a folder location.
first of all you can deploy and invoke this process to see if it is working fine and writing in the location specified during file adapter configuration.
Now go to em console and click on your process.
At bottom you will get Services and Reference tag.
You will find the service that you have created as can be seen.
Click on the adapter service that you have created.
Now go to properties tab of the adapter and you will get the physical directoty location that you have specified during your design time from jdeveloper.
You can change the value of physical directory over here to another location,Make sure the new location already exists and say apply.
No need to do any thing else,just test the composite process again from em console and this time the file will be written into the new location.
Though we have achieved the functionality of changing the file location at run time we still have not made it dynamic that is based on input or some other logic it should automatically goes to different folder location.We will see how we can achieve this now.
Now we will think of the approach that we can use to change the value dynamically.
Which mean we must have to refer to some table in order to map it to different directory structure.So we can use either business rules or DVm for the mapping.
But again we should have one field which should assing different values for output directory.
So first of all we will try to create a variable which can pass the value for output directory.
For this purpose i created a new variable as shown below.
Now we will see how we can use this variable to assign values.
I will drag and drop an assign activity and will pass on a location in my server where i want to write the file.Please make sure that it is within single inverted comma.
this value i will map to the variable which i have created now as can be seen.
now i need to map this value to the file Directory name.
You can know more about this proeprty from following doc
http://download.oracle.com/docs/cd/E12839_01/integration.1111/e10231/adptr_propertys.htm#CHDEDJEA
We have a property called jca.file.directory we will map our variable to this directory.
This takes precedence over the location that we have specified during the design time of adapter.
Just save this project and redeploy it to the server.
Now if you will test your service you will find that the file is now written to the new folder location that we have passed from Expression builder.
so we have got a variable also.Now it is very easy we can create our rule or dvm to assing dynamic values to this variable.We will now see how we can do that.
So now we just need to create one business rule and attach it to our composite.
I created a simple rule as shown below.
It is a simple rule which says if input in ankit send it to poll directory and when input is arpit send it to out directory.YOu can check my previous post on how to create business rules and attach it to your bpel in a composite
http://soa-bpel-esb.blogspot.com/2011/06/business-rules-ruleset-in-soa-suite.html
Now We need only one configuration we need to map the output of the rules to the variable which we have created to assign random outputDirectory so this i have done using an assign activity as you can see below.
That is it.Now deploy the process and depending upon the input it will write in different directory structure.Few common mistakes which you need to take care of if you have defined your input in rules as constant then in that case it will not work with input ankti or arpit rather you will have to use 'ankit' or 'arpit' as input.
failing to do so will give you following error.
Non Recoverable System Fault :
<bpelFault><faultType>0</faultType><operationErroredFault xmlns="http://xmlns.oracle.com/OracleRules1/OracleRules1_DecisionService_1"><part name="payload"><errorInfo xmlns="http://xmlns.oracle.com/OracleRules1/OracleRules1_DecisionService_1"><errorMessage>Fact not found in the rule engine working memory, rule session execution failed. The rule session 40567 failed because an instance of the fact com.oracle.xmlns.sample.dynamicfile.bpelprocessdynamic.ProcessResponse could not be found in the working memory of the rule session. This is most likely a rule modeling error. The decision service interaction expects the fact instance to exist in the working memory of the rule session. Check the rule actions in rule designer and make sure that a fact of the expected type is being asserted. If the error persists, contact Oracle Support Services. 40567</errorMessage></errorInfo></part></operationErroredFault></bpelFault>
So design you process carefully. :)
Tuesday, June 14, 2011
Understanding bpel.config.transaction in SOA suite 11g
This is basically a continuation of my previous post
http://soa-bpel-esb.blogspot.com/2011/06/understanding-transaction-in-soa-suite.html
where in i have tried to explain transaction in soa suite 11g.
there was a single composite instance and we had seen how it was working.
In this exercise we will see how transaction semantics work in soa suite 11g when we have different composites.
I will use the same process which i have used in my previous post.
http://soa-bpel-esb.blogspot.com/2011/06/understanding-transaction-in-soa-suite.html
I will only make a small change in the process.
Instead of calling a db adapter directly i will call another bpel process which is doing the same operation of inserting data in to the same table.
So my functionality remains the same,the only changes is that i am calling a new process to update the database that too i am doing intentionally to show how a separate process starts a new transaction.
this will be very much clear with the example.
I have two process at my end.The first process is just taking an input and calling database adapter to update the record.It looks like this.
Lets Call this process subprocess for understaning purpose.
Now i have a main process where in the flow is like this.
there is an inbound database adapter listening on a table for records.
It is then calling this subprocess to update the record and then it is calling a file adapter to write files in to some folder location.Here also i will revoke the write privilege from this folder to force cause an exception.
So my Main process looks something like this.
Now in my subprocess which is basically a db adapter outbound operation i have following settings for outbound retry
<property name="jca.retry.count" type="xs:int" many="false" override="may">4</property>
<property name="jca.retry.interval" type="xs:int" many="false"
override="may">1</property>
<property name="jca.retry.backoff" type="xs:int" many="false"
override="may">2</property>
<property name="jca.retry.maxInterval" type="xs:string" many="false"
override="may">120</property>
Again in my Main process i have following retry parameter for inbound db adapter
<property name="jca.retry.count" type="xs:int" many="false" override="may">10</property>
<property name="jca.retry.interval" type="xs:int" many="false"
override="may">1</property>
And following retry parameters for my outbound file adapter
<property name="jca.retry.count" type="xs:int" many="false" override="may">2</property>
<property name="jca.retry.interval" type="xs:int" many="false"
override="may">1</property>
Now with this configuration i will try to test my process and see what is the result.
Now you can see that i have specified an inbound db adapter retry value of 10 so we have 11 instance created ,
Again for file adapter i have specified a retry factor of 2 so we have three instance of file adapter created.
Now i will check my sub process ,i can also see 11 instances have created for my sub process also that is my outbound db adapter has update the table 11 times,this is not what i need,ideally since my file adapter was not able to write file it should not have written any records to outbound db table.
This happens because by deafult a new process when linked to an existing process starts its own transaction so the sub process is starting a new transaction and hence there are 11 different instance for the sub process.
Now we want to achieve that when file adapter is not able to write the file into the specified folder no record should be written in to the outbound db adapter and the record from inbound database table should also not be deleted.
To achieve this target
We need to make the Sub process in a single transaction with the Main Bpel process.
To make the sub process to work in a same transaction as that of main process we need to add the following property in our composite.xml of sub process.
<property name="bpel.config.transaction" many="false" type="xs:string">required</property>
Please have a look in the following document to get idea on this property as to where exactly we should use this property
http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10224/soa_transactions.htm#SOASE85811
So now as you can see here i have specified this property in my Sub Process.
Now we need one more configuration,that is by default the inbound db adapter has an infinite number of retry as stated in following document
By default, there is unlimited retry for inbound errors
http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10231/life_cycle.htm#TKADP1892
it also says
In this case, where you set the default value of jca.retry.count to a finite number, even if you do not explicitly configure a value for the jca.retry.count property for a particular inbound adapter endpoint, the global default takes effect.
so we will remove the retry parameters from our inbound adapter and see so that it can take value from GlobalInboundJcaRetryCount which is set to infinite by default.In my previous post i have mentioned how to check this value.
http://soa-bpel-esb.blogspot.com/2011/06/understanding-transaction-in-soa-suite.html
Now we will redploy our whole process and see what is the result ,if we are able to acheive the required functionality.
I redeployed and tested my process.
Now here is my result.
The inbound adapter is polling indefinitely on the input db adpater and it is callin the Sub process but this time the data in the outbound table is not getting updated.so we have acheieved the fucntionality that we wanted to have in two different process by making them participate in a single transaction.
Now just to check my process if it works fine in case when i allow the write permission.
I gave the write permission in my folder location and i saw following results.
The record is deleted from inbound db table
A record is updated in the outbound db table and
a file is written into the folder location.
so this is the perfect scenario i was looking for.
As you can see i have my Sub Process as a syncrhonous process.
If i will make my subprocess as a asynchronous process then i need not do any configuration that is by default the sub process will participate in the same transaction as the main process.This is as per document
http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10224/soa_transactions.htm#SOASE85811
12.1.1 Oracle BPEL Process Manager Transaction Semantics
As with previous releases, Oracle BPEL Process Manager by default creates a new transaction on a request basis. That is, if a transaction exists, it is suspended, and a new transaction is created. Upon completion of the child (new) transaction, the master (suspended) transaction resumes.
However, if the request is asynchronous (that is, one-way), the transaction is either:
Inherited for insertion into the dehydration store (table dlv_message).
Enlisted transparently into the transaction (if one exists).
So As per my understanding asynchronous process should participate in the same transaction as the main process as i can see i am getting the same fucntionality as i have achieved with synchronous process and following settings in the composite.
<property name="bpel.config.transaction"
many="false" type="xs:string">required</property>
I might be wrong but that is what i have understood,so if my understanding is correct we need not create a synchronous bpel process to update the record in our sub process.May be i am missing something and reviewer can correct me on the same.
http://soa-bpel-esb.blogspot.com/2011/06/understanding-transaction-in-soa-suite.html
where in i have tried to explain transaction in soa suite 11g.
there was a single composite instance and we had seen how it was working.
In this exercise we will see how transaction semantics work in soa suite 11g when we have different composites.
I will use the same process which i have used in my previous post.
http://soa-bpel-esb.blogspot.com/2011/06/understanding-transaction-in-soa-suite.html
I will only make a small change in the process.
Instead of calling a db adapter directly i will call another bpel process which is doing the same operation of inserting data in to the same table.
So my functionality remains the same,the only changes is that i am calling a new process to update the database that too i am doing intentionally to show how a separate process starts a new transaction.
this will be very much clear with the example.
I have two process at my end.The first process is just taking an input and calling database adapter to update the record.It looks like this.
Lets Call this process subprocess for understaning purpose.
Now i have a main process where in the flow is like this.
there is an inbound database adapter listening on a table for records.
It is then calling this subprocess to update the record and then it is calling a file adapter to write files in to some folder location.Here also i will revoke the write privilege from this folder to force cause an exception.
So my Main process looks something like this.
Now in my subprocess which is basically a db adapter outbound operation i have following settings for outbound retry
<property name="jca.retry.count" type="xs:int" many="false" override="may">4</property>
<property name="jca.retry.interval" type="xs:int" many="false"
override="may">1</property>
<property name="jca.retry.backoff" type="xs:int" many="false"
override="may">2</property>
<property name="jca.retry.maxInterval" type="xs:string" many="false"
override="may">120</property>
Again in my Main process i have following retry parameter for inbound db adapter
<property name="jca.retry.count" type="xs:int" many="false" override="may">10</property>
<property name="jca.retry.interval" type="xs:int" many="false"
override="may">1</property>
And following retry parameters for my outbound file adapter
<property name="jca.retry.count" type="xs:int" many="false" override="may">2</property>
<property name="jca.retry.interval" type="xs:int" many="false"
override="may">1</property>
Now with this configuration i will try to test my process and see what is the result.
Now you can see that i have specified an inbound db adapter retry value of 10 so we have 11 instance created ,
Again for file adapter i have specified a retry factor of 2 so we have three instance of file adapter created.
Now i will check my sub process ,i can also see 11 instances have created for my sub process also that is my outbound db adapter has update the table 11 times,this is not what i need,ideally since my file adapter was not able to write file it should not have written any records to outbound db table.
This happens because by deafult a new process when linked to an existing process starts its own transaction so the sub process is starting a new transaction and hence there are 11 different instance for the sub process.
Now we want to achieve that when file adapter is not able to write the file into the specified folder no record should be written in to the outbound db adapter and the record from inbound database table should also not be deleted.
To achieve this target
We need to make the Sub process in a single transaction with the Main Bpel process.
To make the sub process to work in a same transaction as that of main process we need to add the following property in our composite.xml of sub process.
<property name="bpel.config.transaction" many="false" type="xs:string">required</property>
Please have a look in the following document to get idea on this property as to where exactly we should use this property
http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10224/soa_transactions.htm#SOASE85811
So now as you can see here i have specified this property in my Sub Process.
Now we need one more configuration,that is by default the inbound db adapter has an infinite number of retry as stated in following document
By default, there is unlimited retry for inbound errors
http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10231/life_cycle.htm#TKADP1892
it also says
In this case, where you set the default value of jca.retry.count to a finite number, even if you do not explicitly configure a value for the jca.retry.count property for a particular inbound adapter endpoint, the global default takes effect.
so we will remove the retry parameters from our inbound adapter and see so that it can take value from GlobalInboundJcaRetryCount which is set to infinite by default.In my previous post i have mentioned how to check this value.
http://soa-bpel-esb.blogspot.com/2011/06/understanding-transaction-in-soa-suite.html
Now we will redploy our whole process and see what is the result ,if we are able to acheive the required functionality.
I redeployed and tested my process.
Now here is my result.
The inbound adapter is polling indefinitely on the input db adpater and it is callin the Sub process but this time the data in the outbound table is not getting updated.so we have acheieved the fucntionality that we wanted to have in two different process by making them participate in a single transaction.
Now just to check my process if it works fine in case when i allow the write permission.
I gave the write permission in my folder location and i saw following results.
The record is deleted from inbound db table
A record is updated in the outbound db table and
a file is written into the folder location.
so this is the perfect scenario i was looking for.
As you can see i have my Sub Process as a syncrhonous process.
If i will make my subprocess as a asynchronous process then i need not do any configuration that is by default the sub process will participate in the same transaction as the main process.This is as per document
http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10224/soa_transactions.htm#SOASE85811
12.1.1 Oracle BPEL Process Manager Transaction Semantics
As with previous releases, Oracle BPEL Process Manager by default creates a new transaction on a request basis. That is, if a transaction exists, it is suspended, and a new transaction is created. Upon completion of the child (new) transaction, the master (suspended) transaction resumes.
However, if the request is asynchronous (that is, one-way), the transaction is either:
Inherited for insertion into the dehydration store (table dlv_message).
Enlisted transparently into the transaction (if one exists).
So As per my understanding asynchronous process should participate in the same transaction as the main process as i can see i am getting the same fucntionality as i have achieved with synchronous process and following settings in the composite.
<property name="bpel.config.transaction"
many="false" type="xs:string">required</property>
I might be wrong but that is what i have understood,so if my understanding is correct we need not create a synchronous bpel process to update the record in our sub process.May be i am missing something and reviewer can correct me on the same.
Monday, June 13, 2011
jca.retry.backoff in SOA Suite 11g
Some new properties have been added in JCA adapters Endpoint properties one of them is jca.retry.backoff.
You can see the defintion of the following properties from here
http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10226/bc_config.htm#SOAAG37202
To understand its use case i have create a simple process to check how does it work,My simple process start with pollin on a database table and after transformation it tries to write a file to a location.
In my case i have revoked the write permission in my file location so as to force my adapter to retry.
So my process looks something like this.
Now initially i have defined these two parameters in my composite.xml for the file adapter reference
<property name="jca.retry.count" type="xs:int" many="false" override="may">3</property>
<property name="jca.retry.interval" type="xs:int" many="false"
override="may">1</property>
Which means rety after a interval of 1 seconds for three time,Now i will check this process and see how my output comes
Now check for the retry time interval.
One instance is created and it retries 3 times on a regular interval of 1 second.
so in all we have 4 adapter invocation so these properties are very much working as expected.
Now i will add the following properties to my jca adapter reference
<property name="jca.retry.count" type="xs:int" many="false" override="may">3</property>
<property name="jca.retry.interval" type="xs:int" many="false"
override="may">1</property>
<property name="jca.retry.backoff" type="xs:int" many="false"
override="may">2</property>
<property name="jca.retry.maxInterval" type="xs:string" many="false"
override="may">120</property>
This will help us to understand how this jca.retry.backoff works.
Now as you can see the output you will find a difference in timing for retry
The first retry start at an interval of 1 second
The second retry start at an interval of 2 second and
The third retry start at an interval of 4 second.
So i believe we are getting some trend here but it is still not clear.
Is this jca.retry.backoff adding cumulatively a delay of 2 second or is it something else
We will just try one more scenario to come to an conclusion as what exactly this proeprty do in combination with jca.retry.maxInterval
Now i will use the following property in my outbound file adapter
<property name="jca.retry.count" type="xs:int" many="false" override="may">3</property>
<property name="jca.retry.interval" type="xs:int" many="false"
override="may">1</property>
<property name="jca.retry.backoff" type="xs:int" many="false"
override="may">3</property>
<property name="jca.retry.maxInterval" type="xs:string" many="false"
override="may">120</property>
The only difference in that rety backoff is 3 this time now we will invoke the process with the following settings to see how does it work.
Now this time the results are
The first retry happens after 1 second(after default)
The second retry happens after 3seconds(after first) and
The third rety happens after 9 second (after second)
So from the previous and this result we can make a relation that the time delay between the call is increasing by Geometric progression of the jca rety backoff factor
i.e initially it was 1 2 4 and now it is 1 3 and 9
So we have got some idea about this property but still i am not clear with the jca.retry.maxInterval property ,as how it was used so we will make some change in this property and see how it works in combination with backoff property.
So now i am using following porperty in my configuration
<property name="jca.retry.count" type="xs:int" many="false" override="may">3</property>
<property name="jca.retry.interval" type="xs:int" many="false"
override="may">1</property>
<property name="jca.retry.backoff" type="xs:int" many="false"
override="may">3</property>
<property name="jca.retry.maxInterval" type="xs:string" many="false"
override="may">60</property>
Now i will see how does it work to get a complete idea.
i invoked the service and the result was almost same as my previous result.
The first rety happens after 1 second
The second retry happens after 3 seconds and
The third retry happens after 9 seconds
so as per my testing this property jca.retry.maxInterval is a waste
but any how we have got the idea on this property jca.retry.backoff
That it increase the delay among retry in a Geometric progression.
If you have defined your fault handling also for a retry then the jca fault handling with run within each fault handling retry.
The same is explained properly in the following document
http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10224/bp_faults.htm#SOASE9928
Example 11-17 Retry Parameters
You can see the defintion of the following properties from here
http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10226/bc_config.htm#SOAAG37202
To understand its use case i have create a simple process to check how does it work,My simple process start with pollin on a database table and after transformation it tries to write a file to a location.
In my case i have revoked the write permission in my file location so as to force my adapter to retry.
So my process looks something like this.
Now initially i have defined these two parameters in my composite.xml for the file adapter reference
<property name="jca.retry.count" type="xs:int" many="false" override="may">3</property>
<property name="jca.retry.interval" type="xs:int" many="false"
override="may">1</property>
Which means rety after a interval of 1 seconds for three time,Now i will check this process and see how my output comes
Now check for the retry time interval.
One instance is created and it retries 3 times on a regular interval of 1 second.
so in all we have 4 adapter invocation so these properties are very much working as expected.
Now i will add the following properties to my jca adapter reference
<property name="jca.retry.count" type="xs:int" many="false" override="may">3</property>
<property name="jca.retry.interval" type="xs:int" many="false"
override="may">1</property>
<property name="jca.retry.backoff" type="xs:int" many="false"
override="may">2</property>
<property name="jca.retry.maxInterval" type="xs:string" many="false"
override="may">120</property>
This will help us to understand how this jca.retry.backoff works.
Now as you can see the output you will find a difference in timing for retry
The first retry start at an interval of 1 second
The second retry start at an interval of 2 second and
The third retry start at an interval of 4 second.
So i believe we are getting some trend here but it is still not clear.
Is this jca.retry.backoff adding cumulatively a delay of 2 second or is it something else
We will just try one more scenario to come to an conclusion as what exactly this proeprty do in combination with jca.retry.maxInterval
Now i will use the following property in my outbound file adapter
<property name="jca.retry.count" type="xs:int" many="false" override="may">3</property>
<property name="jca.retry.interval" type="xs:int" many="false"
override="may">1</property>
<property name="jca.retry.backoff" type="xs:int" many="false"
override="may">3</property>
<property name="jca.retry.maxInterval" type="xs:string" many="false"
override="may">120</property>
The only difference in that rety backoff is 3 this time now we will invoke the process with the following settings to see how does it work.
Now this time the results are
The first retry happens after 1 second(after default)
The second retry happens after 3seconds(after first) and
The third rety happens after 9 second (after second)
So from the previous and this result we can make a relation that the time delay between the call is increasing by Geometric progression of the jca rety backoff factor
i.e initially it was 1 2 4 and now it is 1 3 and 9
So we have got some idea about this property but still i am not clear with the jca.retry.maxInterval property ,as how it was used so we will make some change in this property and see how it works in combination with backoff property.
So now i am using following porperty in my configuration
<property name="jca.retry.count" type="xs:int" many="false" override="may">3</property>
<property name="jca.retry.interval" type="xs:int" many="false"
override="may">1</property>
<property name="jca.retry.backoff" type="xs:int" many="false"
override="may">3</property>
<property name="jca.retry.maxInterval" type="xs:string" many="false"
override="may">60</property>
Now i will see how does it work to get a complete idea.
i invoked the service and the result was almost same as my previous result.
The first rety happens after 1 second
The second retry happens after 3 seconds and
The third retry happens after 9 seconds
so as per my testing this property jca.retry.maxInterval is a waste
but any how we have got the idea on this property jca.retry.backoff
That it increase the delay among retry in a Geometric progression.
If you have defined your fault handling also for a retry then the jca fault handling with run within each fault handling retry.
The same is explained properly in the following document
http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10224/bp_faults.htm#SOASE9928
Example 11-17 Retry Parameters
Sunday, June 12, 2011
Understanding Transaction in SOA Suite 11g with an example
I was working on a scenario to see how transaction works in soa suite 11g and i got to learn a lot of things.Well its not totally related to transaction but still i learned a lot from my exercise and in this post i will be sharing with you my experience and challenges that i have faced during this.
My composite looks flow is
There is an inbound adapter which is polling on a database.
The process starts with picking data from database and then it call another database adapter to insert data into a separate table,
After that i have a file adapter which is writing to a file.
My logic is that i will revoke the write privilege from the folder where i am suppose to write my file,This will cause an error.
so my process should roll back that both inbound and outbound database adapter should not be affected,it should not commit anything.
This will become more clear with the design and then checking the flow.So My bpel process looks something like this.Check out i have designed it initially as asynchronous process.
Now i am using following configuration for my inbound adapter that is polling the record from database and file adapter
<property name="jca.retry.count" type="xs:int" many="false" override="may">2</property>
<property name="jca.retry.interval" type="xs:int" many="false"
override="may">1</property>
Which means the inbound will retry for 2 times as well as the file adapter will try 2 times we will check it in our result to see what exactly happens.
In my case i have intentionally revoked the write privilege from the folder so that it throws a fault.
As you can see it creates one instances and within that instance there are three occurence for calling the file adapter.
This is because we have configured retry for 2 time so original + 2more retry makes it three.
However the inbound db adapter didn't retry as this is a asynchronous process.Had it been a synch process it would have retried even for inbound adapter.
Now what is our expectation in this process.We expect that since file is not written and we got error the other two adapter that is db outbound should not update the table and similarly the inbound db adapter should not remove the record from its table.But this doesn't happen.though it doesn's write record in outbound db adapter but it removes the record from the inbound db adapter.
Now how to achieve our required feature so that neither the record is updated in outbound db adapter nor the record in inbound db adapter is removed.this can be done by making this process a synchronous process.
So as you can see our process starts with the polling of database table which is by default a asynchronous process so just go to the wsdl of the inbound db adapter.
We know that in a synchronous process the request and response message lie in the same operation.So we will modify the process operation and will include an output message also.
so i just added the input message type and changed it to output as can be seen below.
<wsdl:portType name="poll_ptt">
<wsdl:operation name="receive">
<wsdl:input message="tns:SandyCollection_msg"/>
<wsdl:output message="tns:SandyCollection_msg"/>
</wsdl:operation>
</wsdl:portType>
Now just add a reply activity at the end of your process and connect it to the input polling adapter ,when asked for variable just mention the message type you have just created in the wsdl.
So now your process should look something like this after making this process a synchronous one.
Now try to redeploy this process and check the output how does it work.
Now here you will find an interesting scenarion.
Now you will find three instance is getting created this is because this is a synchronous process and we have defined a retry parameter of 2 in inbound db adapter so three instances are getting created for me.
And in each instance the file adapter has been retried twice (including original thrice) as can be seen by opening any errored instance.
Now i checked the inbound table and the record is deleted i checked the outbound table the record is not inserted so still i am not able to get the functionality which i was trying to attain.
But i noticed one thing during the time my process was retrying the record was there in inbound db adapter table as soon as the retry for inbound adapter ends the record gets deleted from the table so if we can somehow set the inbound adapter to retry for unlimited number of time we may be able to attain our functinality.
By default if you have not defined any retry parameter for inbound adapter it is set to infinite as it take the global value for inbound adapter which is set to infinity.this setting you can find in following location.
Go to your em console.
http://host:port/em
Right click on soa-infra
Administration and Systme Mbean Browser
Now here go to oracle.as.soainfra.config
your server then AdapterConfig and then adapter
Now on the right hand side you will find a property called as
GlobalInboundJcaRetryCount
This is by defaule set to unlimited "-1"
So by default if you have not specified any retry parameter in your composite the inbound adapter you keep on trying and you will get instances generated on regular interval of polling interval.But the retry parameter set in composite takes a precedence ove the GlobalInboundJcaRetryCount parameter.So if we will remove the retry parameter from our composite from our inbound adapter then this will poll for indefinite period of time and your data from inbound database table will not be picked.
I removed the retry parameter and then tested this issue and i achieved the functionality that neither the record was deleted from the inbound table nor it was written to the outbound db table.
This infact is not a best approach to design rather we should define fault policies to catch this fault and take appropriate action or we should define compensation handler to take care of such situation.But again if you consider it in real life scenarion once the instance is completed if it is failed then ideally everything should roll back but in our case if we will rollback the record will be polled continously so we should take care of these situation by defining fault handling mechanism to store the faulted record.
My composite looks flow is
There is an inbound adapter which is polling on a database.
The process starts with picking data from database and then it call another database adapter to insert data into a separate table,
After that i have a file adapter which is writing to a file.
My logic is that i will revoke the write privilege from the folder where i am suppose to write my file,This will cause an error.
so my process should roll back that both inbound and outbound database adapter should not be affected,it should not commit anything.
This will become more clear with the design and then checking the flow.So My bpel process looks something like this.Check out i have designed it initially as asynchronous process.
Now i am using following configuration for my inbound adapter that is polling the record from database and file adapter
<property name="jca.retry.count" type="xs:int" many="false" override="may">2</property>
<property name="jca.retry.interval" type="xs:int" many="false"
override="may">1</property>
Which means the inbound will retry for 2 times as well as the file adapter will try 2 times we will check it in our result to see what exactly happens.
In my case i have intentionally revoked the write privilege from the folder so that it throws a fault.
As you can see it creates one instances and within that instance there are three occurence for calling the file adapter.
This is because we have configured retry for 2 time so original + 2more retry makes it three.
However the inbound db adapter didn't retry as this is a asynchronous process.Had it been a synch process it would have retried even for inbound adapter.
Now what is our expectation in this process.We expect that since file is not written and we got error the other two adapter that is db outbound should not update the table and similarly the inbound db adapter should not remove the record from its table.But this doesn't happen.though it doesn's write record in outbound db adapter but it removes the record from the inbound db adapter.
Now how to achieve our required feature so that neither the record is updated in outbound db adapter nor the record in inbound db adapter is removed.this can be done by making this process a synchronous process.
So as you can see our process starts with the polling of database table which is by default a asynchronous process so just go to the wsdl of the inbound db adapter.
We know that in a synchronous process the request and response message lie in the same operation.So we will modify the process operation and will include an output message also.
so i just added the input message type and changed it to output as can be seen below.
<wsdl:portType name="poll_ptt">
<wsdl:operation name="receive">
<wsdl:input message="tns:SandyCollection_msg"/>
<wsdl:output message="tns:SandyCollection_msg"/>
</wsdl:operation>
</wsdl:portType>
Now just add a reply activity at the end of your process and connect it to the input polling adapter ,when asked for variable just mention the message type you have just created in the wsdl.
So now your process should look something like this after making this process a synchronous one.
Now try to redeploy this process and check the output how does it work.
Now here you will find an interesting scenarion.
Now you will find three instance is getting created this is because this is a synchronous process and we have defined a retry parameter of 2 in inbound db adapter so three instances are getting created for me.
And in each instance the file adapter has been retried twice (including original thrice) as can be seen by opening any errored instance.
Now i checked the inbound table and the record is deleted i checked the outbound table the record is not inserted so still i am not able to get the functionality which i was trying to attain.
But i noticed one thing during the time my process was retrying the record was there in inbound db adapter table as soon as the retry for inbound adapter ends the record gets deleted from the table so if we can somehow set the inbound adapter to retry for unlimited number of time we may be able to attain our functinality.
By default if you have not defined any retry parameter for inbound adapter it is set to infinite as it take the global value for inbound adapter which is set to infinity.this setting you can find in following location.
Go to your em console.
http://host:port/em
Right click on soa-infra
Administration and Systme Mbean Browser
Now here go to oracle.as.soainfra.config
your server then AdapterConfig and then adapter
Now on the right hand side you will find a property called as
GlobalInboundJcaRetryCount
This is by defaule set to unlimited "-1"
So by default if you have not specified any retry parameter in your composite the inbound adapter you keep on trying and you will get instances generated on regular interval of polling interval.But the retry parameter set in composite takes a precedence ove the GlobalInboundJcaRetryCount parameter.So if we will remove the retry parameter from our composite from our inbound adapter then this will poll for indefinite period of time and your data from inbound database table will not be picked.
I removed the retry parameter and then tested this issue and i achieved the functionality that neither the record was deleted from the inbound table nor it was written to the outbound db table.
This infact is not a best approach to design rather we should define fault policies to catch this fault and take appropriate action or we should define compensation handler to take care of such situation.But again if you consider it in real life scenarion once the instance is completed if it is failed then ideally everything should roll back but in our case if we will rollback the record will be polled continously so we should take care of these situation by defining fault handling mechanism to store the faulted record.
Thursday, June 09, 2011
Pick activity in SOA suite 11g -Sample
Pick activity is used when you have a business functionality where in you want to trigger a process on onset of several events.That is let suppose if you want to initiate a process as soon as a table is updated in database or a file is written in a local or a remote file location.That mean you basically have three adapter in your inbound operation.File adapter is listening to a local queue,FTP adapter is polling on a remote file location and db adapter is polling a database table.Now as soon as any one of them gets data your process should start.you can achieve this by using pick activity.In this exercise we will create a sample process and see how it works.
This is how my composite and my bpel process looks like.
There are few things that we need to take care of while configuring it.
First of all if you have created a pick activity for initiating a process on onset of data in different place you should not have an on alarm activity as it will not make a sense as your whole purpose is to wait of message to come from any mean,if you will specify a alarm activity you will probably get an error message while compiling this process.
Error(95): onAlarm is in pick with createInstance="yes". No alarms are permitted in this case
So you just need to remove your alarm activity to compile it successfully.
Further if you have not selected createInstance=yes you will again get one more compilation error
Error(59): Initial activity is invalid. An initial activity must be of a receive or pick activity.
Error: there is no receive activity that starts the process
To overcome this issue you need to select the create Instance in the following location
For configuring with each adapter we use onMessage block.
So in our case we have three adapter so we will use three on message block.
I will show one of the block as how it works
Interaction type will be PartnerLink.
IN partnerlink tab click on search button and choose the parnerlink you want to select.
Choose the opearation and create a variable to store that value as shown below.
Similary you can create other adapters also,Let me know if there is an issue.
This is how my composite and my bpel process looks like.
There are few things that we need to take care of while configuring it.
First of all if you have created a pick activity for initiating a process on onset of data in different place you should not have an on alarm activity as it will not make a sense as your whole purpose is to wait of message to come from any mean,if you will specify a alarm activity you will probably get an error message while compiling this process.
Error(95): onAlarm is in pick with createInstance="yes". No alarms are permitted in this case
So you just need to remove your alarm activity to compile it successfully.
Further if you have not selected createInstance=yes you will again get one more compilation error
Error(59): Initial activity is invalid. An initial activity must be of a receive or pick activity.
Error: there is no receive activity that starts the process
To overcome this issue you need to select the create Instance in the following location
For configuring with each adapter we use onMessage block.
So in our case we have three adapter so we will use three on message block.
I will show one of the block as how it works
Interaction type will be PartnerLink.
IN partnerlink tab click on search button and choose the parnerlink you want to select.
Choose the opearation and create a variable to store that value as shown below.
Similary you can create other adapters also,Let me know if there is an issue.
Tuesday, June 07, 2011
Java Callout to use external Java classes in Mediator
I am using following document for this exercise
http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10224/med_createrr.htm#SOASE9296
In this exercise we will use the concept of this document and will create a sample scenario to understand the use case in a better way.
http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10224/med_createrr.htm#SOASE9296
In this exercise we will use the concept of this document and will create a sample scenario to understand the use case in a better way.
Monday, June 06, 2011
Integrating Oracle Ebusiness Suite with Soa Suite 11g
http://blogs.oracle.com/ebusinesssuiteintegration/entry/business_events_-_ebs_adater_v
http://download.oracle.com/docs/cd/E21764_01/integration.1111/e10537/T430238T430339.htm
http://download.oracle.com/docs/cd/E21764_01/integration.1111/e10537/T430238T430339.htm
Business Rules-Links in SOA Suite 11g
Links in Business rules is used to link one dictionary to other dictionary ,decision rule etc,you can review the following document to get more idea on the same
http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10228/rtdt.htm#ASRUG523
http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10228/data_model.htm#ASRUG273
http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10228/data_model.htm#CHDIJFEA
http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10228/adfbc.htm#ASRUG753
In this exercise we will how to create a link and how it can be used in your project.
Ok we will take the same example that we are working with previously in business Rules.
In this we will add one more Business rule so now my process will look something like this
Now open your second rule and go to link tab and click on + sign and add a resource picker.
Now choose the businessRules1 dictionary as shown below
Now whatever is there in the dictionary will now be included in the current businessRule2 dictionary.
So as you can see all the bucketset,functions and globals that we have defined in our businessRule1 dictionary is now available in businessRule2 dictionary.
So just now try to create a simple business ruleset and in the drop down you will find the bucketset defined in dictionary1.
http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10228/rtdt.htm#ASRUG523
http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10228/data_model.htm#ASRUG273
http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10228/data_model.htm#CHDIJFEA
http://download.oracle.com/docs/cd/E17904_01/integration.1111/e10228/adfbc.htm#ASRUG753
In this exercise we will how to create a link and how it can be used in your project.
Ok we will take the same example that we are working with previously in business Rules.
In this we will add one more Business rule so now my process will look something like this
Now open your second rule and go to link tab and click on + sign and add a resource picker.
Now choose the businessRules1 dictionary as shown below
Now whatever is there in the dictionary will now be included in the current businessRule2 dictionary.
So as you can see all the bucketset,functions and globals that we have defined in our businessRule1 dictionary is now available in businessRule2 dictionary.
So just now try to create a simple business ruleset and in the drop down you will find the bucketset defined in dictionary1.
FTP Adapter in SOA Suite 11g
In this exercise i will create a simple process (inbound operation) to poll a file from a remote FTP server.This is how my process looks like.
There are few things which we need to take care of.
1>The FTP server JNDI name
In the adapter configuration wizard you will get this detail
as you can see in my case it is eis/ftp/FtpAdapter
This is the default jndi created and i need to create the same in my admin server.
we will check it later first we will what all we need to see in configuration wizard
Now since i am polling data i will be using a get data to get the data from the FTP location
Provide the location of the remote FTP server which you are polling.
I am making a wild card entry
finally i am using an opaque schema to validate the file.
Now coming back to the configuration required from admin console.
Log in to admin console
http://host:port/console.
Go to Deployment and choose FTP adapter as shown
Now go to configuration and then outbound configuration pools and create a new connection pool by clicking on new.
I already have created a connection pool with the same name as has come in jdeveloper as you can see "eis/ftp/FtpAdapter"
Now open the connection that you have create and check for the attributes
you need to specify four attributes there
first is host name
It is the name of the remote host from where you are polling data as can be seen
You need to specify the password to connect to the server and the port in which FTP server will be connected,by default it is 21(in my case it is 21)
Now in the last page of the attribute you have to specify the name of the username,this is the username for the remote machine.
These are the configuration that you need to do in order to make your FTP adapter in soa suite 11g work.One important thing is that do update your FTP adapter configuration once you are done with all the settings.
Now copy a text file in the location which is to be polled and you will find it will be polled as per the polling frequency and you will see an instance generated in the em console.
I will demonstarte this by using the most common FTP server fileZilla.
I have my soa server in remote machine,and i will install a fileZilla FTP server in my local machine.One you download the server,just extract and install it at your end.If you wish you can create a group also but a user only will work.
Create user and map a local drive in your machine as you can see.There is one important thing to consider here that this directory will be considered as a root directory for the remote server.
Now as you can see the directory structure i have mapped D:\RemoteFTP as my root directory.Now i will create a new folder within this called test.So now my configuration will look something like this in jdeveloper for the location
As you can see ideally i should have provide the path as D:\RemoteFTP\test but i have specified it as \test because D:\RemoteFTP now acts as my root directory so FTP server will start looking from root directory.Similary in the admin console we need to make some changes as shown below
Update your deployment and test this issue again by putting a file in the FTP location and you will get an instance in em console.
In SOA suite 11.1.1.2 there is an issue with FTP adapter
It gets failed with following exception
Caused by: BINDING.JCA-12563
Exception occured when binding was invoked.
Exception occured during invocation of JCA binding: "JCA Binding execute of Reference operation 'execute' failed due to: JCA Binding Component connection issue.
JCA Binding Component is unable to create an outbound JCA (CCI) connection.
Caused by: javax.resource.spi.ApplicationServerInternalException: Unable to get a connection for pool = 'eis/ftp/FTPAdapter', weblogic.common.resourcepool.ResourceDeadException
at weblogic.connector.outbound.ConnectionManagerImpl.getConnectionInfo(ConnectionManagerImpl.java:394)
at weblogic.connector.outbound.ConnectionManagerImpl.getConnection(ConnectionManagerImpl.java:307)
at weblogic.connector.outbound.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:115)
at oracle.tip.adapter.ftp.FTPConnectionFactory.getConnection(FTPConnectionFactory.java:98)
at oracle.integration.platform.blocks.adapter.fw.jca.cci.JCAConnectionManager$JCAConnectionPool.createJCAConnection(JCAConnectionManager.java:1355)
this error occurs as connection pool gets exhausted.The FTP adapter keeps the exhausted in the connection pool and do not release it causing in a weblogic.common.resourcepool.ResourceDeadException
I checked this issue in SOA Suite 11.1.1.4 and i didn't faced any issue.
There are few things which we need to take care of.
1>The FTP server JNDI name
In the adapter configuration wizard you will get this detail
as you can see in my case it is eis/ftp/FtpAdapter
This is the default jndi created and i need to create the same in my admin server.
we will check it later first we will what all we need to see in configuration wizard
Now since i am polling data i will be using a get data to get the data from the FTP location
Provide the location of the remote FTP server which you are polling.
I am making a wild card entry
finally i am using an opaque schema to validate the file.
Now coming back to the configuration required from admin console.
Log in to admin console
http://host:port/console.
Go to Deployment and choose FTP adapter as shown
Now go to configuration and then outbound configuration pools and create a new connection pool by clicking on new.
I already have created a connection pool with the same name as has come in jdeveloper as you can see "eis/ftp/FtpAdapter"
Now open the connection that you have create and check for the attributes
you need to specify four attributes there
first is host name
It is the name of the remote host from where you are polling data as can be seen
You need to specify the password to connect to the server and the port in which FTP server will be connected,by default it is 21(in my case it is 21)
Now in the last page of the attribute you have to specify the name of the username,this is the username for the remote machine.
These are the configuration that you need to do in order to make your FTP adapter in soa suite 11g work.One important thing is that do update your FTP adapter configuration once you are done with all the settings.
Now copy a text file in the location which is to be polled and you will find it will be polled as per the polling frequency and you will see an instance generated in the em console.
I will demonstarte this by using the most common FTP server fileZilla.
I have my soa server in remote machine,and i will install a fileZilla FTP server in my local machine.One you download the server,just extract and install it at your end.If you wish you can create a group also but a user only will work.
Create user and map a local drive in your machine as you can see.There is one important thing to consider here that this directory will be considered as a root directory for the remote server.
Now as you can see the directory structure i have mapped D:\RemoteFTP as my root directory.Now i will create a new folder within this called test.So now my configuration will look something like this in jdeveloper for the location
As you can see ideally i should have provide the path as D:\RemoteFTP\test but i have specified it as \test because D:\RemoteFTP now acts as my root directory so FTP server will start looking from root directory.Similary in the admin console we need to make some changes as shown below
Update your deployment and test this issue again by putting a file in the FTP location and you will get an instance in em console.
In SOA suite 11.1.1.2 there is an issue with FTP adapter
It gets failed with following exception
Caused by: BINDING.JCA-12563
Exception occured when binding was invoked.
Exception occured during invocation of JCA binding: "JCA Binding execute of Reference operation 'execute' failed due to: JCA Binding Component connection issue.
JCA Binding Component is unable to create an outbound JCA (CCI) connection.
Caused by: javax.resource.spi.ApplicationServerInternalException: Unable to get a connection for pool = 'eis/ftp/FTPAdapter', weblogic.common.resourcepool.ResourceDeadException
at weblogic.connector.outbound.ConnectionManagerImpl.getConnectionInfo(ConnectionManagerImpl.java:394)
at weblogic.connector.outbound.ConnectionManagerImpl.getConnection(ConnectionManagerImpl.java:307)
at weblogic.connector.outbound.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:115)
at oracle.tip.adapter.ftp.FTPConnectionFactory.getConnection(FTPConnectionFactory.java:98)
at oracle.integration.platform.blocks.adapter.fw.jca.cci.JCAConnectionManager$JCAConnectionPool.createJCAConnection(JCAConnectionManager.java:1355)
this error occurs as connection pool gets exhausted.The FTP adapter keeps the exhausted in the connection pool and do not release it causing in a weblogic.common.resourcepool.ResourceDeadException
I checked this issue in SOA Suite 11.1.1.4 and i didn't faced any issue.