Today i received a nice little present from Oracle!
My ACE trophy, another one for the collection (though it’s still quite empty)....
Yesterday great news from the Oracle grounds, i received an invitation for the Oracle ACE Award! I'm honored they give me this chance and i will continue my contribution to the Oracle Community. The Oracle Ace Program Original.......
In this blog we will develop the next flow
In JDeveloper create a new SOA Application with an empty SOA Project in it.
For this blog i created a simple synchronous HelloWorld bpel process which will return the “Hello ” + the inputparameter string..
And that’s pretty much it what is needed for the composite. The flow should look something like this.
For the development of the Oracle Service Bus process we need a few components
Create a new OSB Configuration Project in Oracle Enterprise Pack for Eclipse.
Creata a new OSB Project.
Communication with the Oracle SOA Suite components will make use of the new SOA-DIRECT transport available in the Oracle Service Bus 11g...
In a few short blogs i will describe how to develop the following process flows
We will develop the next process flow
For the development of the Oracle Service Bus process we need a few components
For this i created a simple HelloWorld Webservice which will only returns the “Hello …” string.
package nl.iteye.service.hello; import javax.jws.*; @WebService public class MyHelloService { @WebMethod public String hello(String name) { return "Hello " + name; } }
Deploy the service and test it to see if if the invocation works.
Create a new OSB Configuration Project in Oracle Enterprise Pack for Eclipse.
Creata a new OSB Project.
Create a new Busines Service in this project and use the next settings.
Use the wsdl of the deployed MyHelloService. Easiest way to find this url is to go to the Console > Deployments > MyHelloServiceEAR > Testing > MyHelloServiceService > ?WSDL
Basicually we can use the default settings after browsing to the correct wsdl.
Create a new Proxy Service based on this Business Service
By default it will create a Proxy Service with HTTP Transport, change this to SB Transport. This will be used eventually when we invoke the service from our Composite Application.
We will have the next list of resources
We’re ready with the Oracle Service part. Deploy the project.
In JDeveloper create a new SOA Application with an empty SOA Project in it.
Eventually we will be creating the next flow
First we need the effective wsdl of our Proxy Service. This we will be using for the Direct Binding reference from our composite to the Oracle Service Bus resource.
From Eclipse :
In the wsdl we’ll see the Binding- and the Service-parts. In the Service location we will see the sb:// endpoint of the Proxy Service.
<WL5G3N0:service <WL5G3N0:port <WL5G3N2:address </WL5G3N0:port> </WL5G3N0:service>
Drag the Direct Binding Service Adapter on the swim lane
In this case we are invoking an osb resource, so we will be using ‘Reference’ as Type and ‘Oracle Service Bus’ as Reference Target.
For the WSDL URL browse to the location at which your exported and unpacked the Effect WSDL. Let the wizard copy the resource into the project and don’t maintain the original directory structure.
Drag the Mediator component to the middle swim lane.
For the mediator interface i will use the same wsdl, to keep it simple.
Drag the left arrow of the mediator the to the left swim lane. Now we will have a soap endpoint to test against.
Drag the right arrow to the Direct Binding Service we created in the first step. Doubleclick the mediator to add the transformations.
The process should be done by now. Deploy the SOA Composite.
Go to the Enterprise Manager Console and test the application.
Click “Launch Message Flow Trace” to see what got executed.
In here we will see the Hello_PS_Direct of type ‘Direct Binding’ got executed.
To see if the invoke really triggered my OSB Resources i added tracing to the Proxy Service.
[OSB Tracing] Routing to SOADirectBinding/hello_bs with message context: $body = <soap-env:Body xmlns: <tns:hello xmlns: <arg0>Eric</arg0> </tns:hello> </soap-env:Body>
[OSB Tracing] The following variables are changed: $body = <S:Body xmlns: <ns2:helloResponse xmlns: <return>Hello Eric</return> </ns2:helloResponse> </S:Body>
The steps we need to communicate sync from the Composite Application with the Oracle Service Bus :
Create a proxy service with sb-transport in the Oracle Service Bus, use the effective wsdl from this service to create a reference service with the Direct Binding adapter and you’re ready to go.
The other steps needed are just the usual steps to create and implement the Composite Application and the resources in the Oracle Service Bus.
My blog is moved to a new location.
From now on you will find all the old posts both on and
The new posts will only get added to
Hope you will enjoy the new site!
After reading a nice article about TimerManager functionality in Weblogic, i wanted to see how easy it would be to schedule my test composite application.
First deploy your composite and go to SOA > soa-infra > default > Test > WSDL.
Copy/paste the wsdl, this one we will use to generate the web proxy.
Back in JDeveloper create a new Application (or add it to an existing one), and create a new Web Project.
Select the jsp option, we will use this page later to trigger the scheduler.
Right mouseclick on the Project > New > Business Tier > Web Services > Web Service Proxy
Fill in the url which we copy/pasted from the Test console of the composite application.
Fill in your package structure
We only have a synchronious service call
Here we have the option to apply any policies
This will generate all the code we need to invoke the composite application (wsdl).
The class with the name ending with ‘_ptClient’ contains all the code needed to do the invoke from java. This we will reuse later on.
For a little test, change the code so it calls the correct method of your composite application and check the console to see if it triggers a new instance.
Now we know for sure the proxy code itself is working, so we can go on with the code to schedule the invoke.
The code of the TimerManager i borrowed from this excellent blog.
Create both ‘TimerServlet’ servlet and the ‘TimerListener’ class, edit web.xml, and add link to the servlet to the index.jsp which we generated in one of the earlier steps.
Now copy/paste the example code of the ‘_ptClient’ class to the ‘TimerListener’ class, and select the method you want to call (in my case the ‘process’ method).
Add a new WAR File Deployment Profile to the project.
Right mouseclick on the Project > Deploy > MyTimerApp and either select to deploy right away to the Application Server or to a local WAR archive.
Go to the url of the index.jsp to trigger the scheduler, for example
Console output
inside timerExpired() Starting schedule bpel, Fri May 21 12:25:03 CEST 2010 Finishing schedule bpel, response is : setOutput exiting timerExpired() inside timerExpired() Starting schedule bpel, Fri May 21 12:25:13 CEST 2010 Finishing schedule bpel, response is : setOutput exiting timerExpired() inside timerExpired() Starting schedule bpel, Fri May 21 12:25:23 CEST 2010 Finishing schedule bpel, response is : setOutput exiting timerExpired()
Overview of the Composite instances which were created
JDeveloper Project – It includes the generated code/imports against my own composite application. Regenerate the code against your own wsdl, and revalidate the code.
“A Resequencer is used to rearrange a stream of related but out-of-sequence messages back into order. It sequences the incoming messages that arrive in a random order and then send them to the target services in an orderly manner. The sequencing is done based on the sequencing strategy selected.”
For the resequencer to work we need to have 2 values in the source payload. The first one is a sequenceID, and the next one is a groupdID. The sequenceID will be used as identifier for the message itself. The groupID will be used to group the messages in which the resequencer will rearrange the messages based on the sequenceID. Different groups will have seperate processing, so they won’t have any influence on each other.
The mediator supplies us 3 types of resequencers :
Let’s test the first one.
For this i created the next composite
In here i just map the input of the process 1on1 to the File adapter, which will store the input of the process on filesystem.
Interface of the composite
<?xml version="1.0" encoding="UTF-8"?> <schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="" xmlns=""> <element name="process"> <complexType> <sequence> <element name="empID" type="string"/> <element name="empType" type="string"/> <element name="empName" type="string"/> </sequence> </complexType> </element> <element name="processResponse"> <complexType> <sequence> <element name="result" type="string"/> </sequence> </complexType> </element> </schema>
Doubeclick the mediator component in the composite.
For the Resequence Level we can select ‘operations’ or ‘component’.
For Mediator components which only have 1 operation it doesn’t matter which one we select. For a Mediator component which consists of more then 1 operation and selecting the ‘component’ option means resequencing is applied to all operations in it. For this test we selected the ‘component’ option and used the ‘Standard’ mode.
Now we have several options to configurate the resequencer.
And that’s it what is needed for the configuration of the ‘Standard’ resequencer.
To test this scenario i will use the following 3 messages.
<soap:Envelope xmlns: <soap:Body xmlns: <ns1:process> <ns1:empID>1</ns1:empID> <ns1:empType>IT</ns1:empType> <ns1:empName>Eric</ns1:empName> </ns1:process> </soap:Body> </soap:Envelope>
<soap:Envelope xmlns: <soap:Body xmlns: <ns1:process> <ns1:empID>2</ns1:empID> <ns1:empType>IT</ns1:empType> <ns1:empName>John</ns1:empName> </ns1:process> </soap:Body> </soap:Envelope>
<soap:Envelope xmlns: <soap:Body xmlns: <ns1:process> <ns1:empID>3</ns1:empID> <ns1:empType>IT</ns1:empType> <ns1:empName>Theo</ns1:empName> </ns1:process> </soap:Body> </soap:Envelope>
Go to the console > soa_domain > SOA > soa-infra > > and Test it.
If we trigger the process 3 times with the payloads as we describes and in the same sequence, the instances will all complete and write the files to filesystem in the same sequence.
We used the ‘Standard’ mode and selected empID for sequence-value and emptType for group-value, and the sequence should start with 1 and will increment by 1.
Now switch the last 2 messages in the sequence and see what happens. Since we’re trying to process and already processed message again we will get the next errormessage
The selected operation execute could not be invoked. An exception occured while invoking the webservice operation. Please see logs for more details. oracle.sysman.emSDK.webservices.wsdlapi.SoapTestException: oracle.tip.mediator.infra.exception.MediatorException: ORAMED-03003:[Storing Resequencer Group Failed]Unable to store Resequencer Group." oracle.tip.mediator.common.persistence.MediatorResequencerMessage, mediator InstanceId=E07531315F8511DFBFBF3B164F19FDA3, componentDn=default/MyReSequence!1.0/Mediator1, operation=execute, groupId=IT, sequenceId=1, status=0"Possible Fix:Unable to store Resequencer Group. Check your Database connection or check data
So change all empType to ‘HR’ instead of ‘IT’.
For example
<soap:Envelope xmlns: <soap:Body xmlns: <ns1:process> <ns1:empID>1</ns1:empID> <ns1:empType>HR</ns1:empType> <ns1:empName>Eric</ns1:empName> </ns1:process> </soap:Body> </soap:Envelope>
The sequence we’re now going to use is empID=1, empID=3, empID=2
After sending the second message (empID=3), you will notice the instance won’t complete. Because the resequencer expects an empID=2. In this case it will wait till this message arrives.
<soap:Envelope xmlns: <soap:Body xmlns: <ns1:process> <ns1:empID>2</ns1:empID> <ns1:empType>HR</ns1:empType> <ns1:empName>Eric</ns1:empName> </ns1:process> </soap:Body> </soap:Envelope>
Now use the last test message (empID=2) and see what happens.
Instance 30030 changes from Running to Completed. This is because it received the next message in the sequence (empID=2), and after that the instance 30030 (empID=3) could continue.
If we check the files on filesystem we also see (compair the datetime of the files) that the files are stored in the correct sequence.
Besides the ‘Standard’ resequencer wel also have the ‘FIFO’- and the ‘BestEffort’ resequencer.
See this document to decide what resequencer suits best for your case.
In the new Oracle Service Bus 11g, Oracle gives us new functionality for the use of custom xpath functions.
These functions we eventually can re-use in for example the xslt or xquery transformations.
For this we need :
All these files need to be stored at the next location
<OSB_HOME>/config/xpath-functions.
%OSB_FUNCTIONS%=Service Bus Functions
%FUNC_CUSTOM_CONCAT_COMMENT%=Returns the concat of the first and the second parameter
Not much in here,just a few placeholders for the descriptions.
By default the logging for the events are turned off.
Connect to your DEV_SOAINFRA schema and execute :
DECLARE ENABLED NUMBER; BEGIN ENABLED := 1; EDN_ENABLE_LOGGING( ENABLED => ENABLED ); END;
Trigger a new business event and select the logging in the ‘EDN_LOG_MESSAGES_TABLE’ (select * from edn_log_messages)
During testing of some of my composite applications i just couldn’t get the ‘Launch Message Flow Trace’ link showing the output (popup it seemed later on).
Chrome didn’t came up with the a blocking popup so it didn’t ring any bells.
Google Chrome > Options > Under the Hood > Content Settings > Pop-ups > and add your hostname to the exception list
Yesterday great news from the Oracle grounds, i received an invitation for the Oracle ACE Award!
I’m honored they give me this chance and i will continue my contribution to the Oracle Community.