Wednesday, December 17, 2014

Oracle SOA Suite 11g - Preferences



BPEL preference properties are extensively used in many projects.
One use case would be, passing the endpoint location to inoke activity. So it’s a very important command which a developer should know.

In 10g we had a functionality to add preferences to bpel process and by adding below command in bpel.xml file we could pass the value as a variable to our bpel process. And there was also an option to change the value of preference from BPEL console which made it dynamic.

Coming to 11g we still have this functionality but things has changed a little and now we need to add preferences in composite.xml file for a particular bpel process i.e. under component tab of a particular bpel:

Code Snippet of composite.xml
<component name="BPELProcess1">
  <implementation.bpel src="BPELProcess1.bpel"/>
  <property name="bpel.preference.myPref">anyValue</property>
</component>


Now we can use the function ora:getPreference(myPref) in our bpel process to retrieve the value of the preference.

Code Snippet of .bpel
<assign name="AssignManagerDetails">
……………
  <copy>
    <from expression="ora:getPreference('myPref') "/>
    <to variable="Manager" part="payload"
     query="/client:processResponse/client:id"/>
  </copy>
……
</assign>

Or if we define the preference value in composite.xml as some endpoint location, we can use that in invoke.
<invoke name="Invoke_ExecuteEligibility" partnerLink="EligibilityManagement"
    portType="ns8:EligibilityManagementPortType_v1" operation="ExecuteEligibility"
    inputVariable="executeEligibilityRequest" outputVariable="executeEligibilityResponse"
    bpelx:invokeAsDetail="no">
    <bpelx:toProperties>
        <bpelx:toProperty name="endpointURI"
            >ora:getPreference('myPref')</bpelx:toProperty>
    </bpelx:toProperties>
</invoke>


It’s a very good approach to pass end points to invoke through preferences, as later on we can define preferences in cfgplan.xml which will override the values present in composite.xml while deployment.
So a better approach would be to give for ex localhost as the endpoint location in composite.xml and use that preference in invoke or assign.
And give the actual endpoint location in configuration plan(cfgplan.xml) file. For ex.

Code Snippet of cfgplan.xml
<component name=" BPELProcess1">
    <property name="bpel.config.<invoke_name>">
      <replace> http://<actualendPoint>:8001/xyz/abc-v1</replace>
    </property>
</component>

To change the preference value from console:
To change to values from the prefences go to the ‘Enterprise Manager’ (http://localhost:7001/em).
On the left go to :
Farm_soa_domain > Weblogic Domain > soa_domain > right mouseclick and select ‘System MBean Browser’.
Navigate to Application Defined MBeans > oracle.soa.config > Server : soa_server1 > SCAComposite > your_project > SCAComposite.SCAComponent > your bpel_process.
Select the Attribute ‘Properties’.
Change the value of our preference and click apply.
Run the bpel again to see if the new value got used in the process.