Thursday 11 July 2013

FILE ADAPTER : IgnoreZeroByteFile

PROBLEM DESCRIPTION:
--------------------
We are using FileAdapter 11.1.1.5.0 with SOASuite SyncReadMode to read 0 byte
data file. We don't want it cause exception,but it caused even we use IgnoreZeroByteFile Property="true" in
composite.xml.

EXPLANATION:
------------
The current behavior is expected .
In this  use case ,the file read uses a specific schema for it's translation
The property "IgnoreZeroByteFile" is only applicable to "opaque schema"

If you refer to the Table "36-5 Oracle File Adapter Properties" in the link
http://docs.oracle.com/cd/E14571_01/integration.1111/e10226/bc_config.htm

it clearly mentions that
" This parameter(IgnoreZeroByteFile)  is ignored if the schema for the
inbound file is anything other than opaque. "

So , for the current case , setting the property IgnoreZeroByteFile to
true/false would have no effect on the processing.

FAULT HANDLING : SCHEMA VIOLATED INPUT FILES

PROBLEM STATEMENT:
------------------
Schema violated input files are not moved to other directories as specified
in fault-policies.xml

In SOA Suite 11.1.1.5.0, customer has the following scenario where he wants
messages that are non compliant with xml schema be written to a file.

File Adapter Read -> BPEL -> File Adapter Write

The inbound file adapter has 'validateXML' set to true.
When a message is read that is not in compliance with xml schema, BPEL throws
'bpelx:invalidVaraibles' which is NonRecoverable System fault.

In fault-policies.xml, they have writeToFile action defined.

----------------------
<?xml version='1.0' encoding='UTF-8'?>
<faultPolicies xmlns="http://schemas.oracle.com/bpel/faultpolicy">
<faultPolicy version="1.0" id="AsyncFireForgetFaultPolicy"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns="http://schemas.oracle.com/bpel/faultpolicy"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Conditions>
<faultName xmlns:rjm="http://schemas.oracle.com/sca/rejectedmessages"
name="rjm:IndustryFlowS0015FileReadAdapter">
<condition>
<action ref="writeToFile"/>
</condition>
</faultName>
<faultName xmlns:rjm="http://schemas.oracle.com/sca/rejectedmessages"
name="rjm:IndustryFlowS0004FileReadAdapter">
<condition>
<action ref="writeToFile"/>
</condition>
</faultName>
...
...
<Action id="writeToFile">
<fileAction>
<location>/home/fusdevu/EDF_Yoyager_RejectedMessages/OTHERS</location>
<fileName>RejectedMessage_%TIMESTAMP%.xml</fileName>
</fileAction>
</Action>
<Action id="ora-human-intervention">
<humanIntervention/>
</Action>
<Action id="writeToMDMErrorFile">
<fileAction>
<location>/home/fusdevu/EDF_Yoyager_RejectedMessages/MDM</location>
<fileName>RejectedMessage_%TIMESTAMP%.xml</fileName>
</fileAction>
</Action>
</Actions>
</faultPolicy>
</faultPolicies>


EXLANATION:
----------
The current behavior (of the fault framework not being invoked) is expected and as per design.

Basically , the fault management framework would catch all faults (business
and runtime) for an invoke activity
[Refer to section
12.4 Using the Fault Management Framework in the link below
http://download.oracle.com/docs/cd/E12839_01/integration.1111/e10224/bp_faults.htm#BABIGGIB]

Since , in the current test case the fault does not happen on an "invoke"
activity , the fault framework never gets executed.

Moreover , you should understand that the "validateXML" property is being set
on the partner-link and not on the FileAdapter Service itself - that means
that the FileAdapter "Read" will not validate the payload , but it would be
the "BPEL Receive Activity" which does the validation.

As mentioned before , since the fault framework will not be invoked on a
"BPEL Receive Activity Fault" the "invalidVariables" error would not be
handled by the fault framework.

The way to get past this issue would be  to validate the payload against the
schema at the FileAdapter Read Service itself  , so that the invalid file is
not passed on the BPEL Layer .

Please change the XSD  to include nxsd:validation="true" , remove
the "validateXML" property from the Partner-Link and redeploy the project
.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns="http://www.example.org"
            targetNamespace="http://www.example.org"
            elementFormDefault="qualified"
             xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
              nxsd:validation="true">

This form of validation would control the publishing of invalid records and
provide information about XML validation errors.

Since the "fault" is now being thrown from the FileAdapter Service - the
fault framework would be invoked and the "writeFile" action would be
executed.

SOA WORKFLOW NOTIFICATION : CUSTOMIZE EMAIL HEADER PREFIXES


Workflow does support header customizations via "WorkflowCustomClasspathURL"

The customized resource bundles can be  packaged as a jar file and referred
from WorkflowCustomClasspathURL.

Please follow the steps below to customize the EMAIL headers:
1. Navigate to MW_HOME/Oracle_SOA1/soa/modules/oracle.soa.workflow_11.1.1
2. From the library bpm-services.jar extract the following directory to a local location:
    oracle/bpel/services/workflow/resource

Note:
-----
i. The reason , we extract these resource bundles from the SOA directory is
to be sure that we have the latest properties.
ii. Please make sure that the directory structure is maintained in the
extracted folder
iii. Delete the class file i18NUtil.class from the extracted directory
  
3. Make the following modifications in WorkflowLabels.properties 
  A. To customize "Action Required"
      TASK_VIEW_CONTEXT_ASSIGNEE_ASSIGNED=Action Required
      to
      TASK_VIEW_CONTEXT_ASSIGNEE_ASSIGNED=Customized Action Required
  B.  To customize "Routed"
      TASK_VIEW_CONTEXT_ROUTED=Routed
      to
      TASK_VIEW_CONTEXT_ROUTED=Action Required
  C. To customize "Completed to Approved" and "Completed to Rejected"
     Add
     TASK_VIEW_CONTEXT_ASSIGNEE_APPROVE=Approved
     TASK_VIEW_CONTEXT_ASSIGNEE_REJECT=Rejected
  Please repeat the procedure for any other languages by editing the
appropriate  translated WorkflowLabels_**.properties files.
.
 4. Zip back the entire folder into a jar file (say , customizedbundle.jar)
 5. The 'WorkflowCustomClasspathURL' parameter can be configured from the EM
SOA Console.
   [soa-infra - Administration - System MBean Broswer - Application Defined
MBeans - oracle.as.soainfra.config
          - Server: <Instance Name>
            - WorkflowConfig
              - human-workflow - WorkflowCustomClasspathURL)
   Provide the path to customizedbundle.jar
    => file:///{path_to_customizedbundle.jar}
 6. Click Apply
   Verify that the email subject contains the intended changes.

SOA WORKLIST : SQL AUTHENTICATOR


PROBLEM STATEMENT:
-------------------
Create sql authenticator as security provider.
The user "xc"(in administrator Group) defined in db can login weblogic console.
But when login
http://<host>:<port>/integration/worklistapp
it reports error:
User "xc" is not found in configuration "jazn.com" and the
exception was thrown repeatedly and it seems infinite redirection loop occurs
------------
Caused By: ORABPEL-10509

User not found.
User "xc" is not found in configuration "jazn.com"


EXPLANATION:
------------
The issue is caused because the worklist application only authenticates via
LDAP Authenticator and ignores SQLAuthenticator.

This is a know issue and has been address via a workaround.

Please refer to Note 1194815.1.
  Download the  attachment : workflow-120-SQLIdentityProvider.zip
  Copy dbprovider.jar from workflow-120-SQLIdentityProvider\lib
  to MW_HOME/user_projects/domains/{soa_domain}/lib
.
And follow the steps below:
1. Shutdown SOA and Admin Server
2. Navigate to MW_HOME/user_projects/domains/{domain_name}/config/fmwconfig
3. Backup jps-config.xml
4. Edit jps-config.xml and make the following modifications
  A. Modify
  <serviceInstanceRef ref="idstore.ldap"/> to
  <serviceInstanceRef ref="idstore.custom"/>
    under <jpsContext name="default">
  B. Add
     <serviceInstance name="idstore.custom" provider="custom.provider"
location="dumb">
<description>Custom Identity Store Service Instance</description>
<property name="idstore.type" value="CUSTOM"/>
<property name="ADF_IM_FACTORY_CLASS"
value="org.sample.providers.db.DBIdentityStoreFactory"/>
<property name="DB_SERVER_NAME" value="db_host_name"/>
<property name="DB_SERVER_PORT" value="db_port"/>
<property name="DB_DATABASE_NAME" value="db_sid"/>
<property name="ST_SECURITY_PRINCIPAL" value="db_user"/>       
<property name="ST_SECURITY_CREDENTIALS" value="db_passwd"/>   
</serviceInstance>
   under <serviceInstances>
     change the db_* parameters as per the environment
 C. Add
<serviceProvider type="IDENTITY_STORE" name="custom.provider"
class="oracle.security.jps.internal.idstore.generic.GenericIdentityStoreProvid
er">
              <description>Custom IdStore Provider</description>
</serviceProvider>
 within <serviceProviders> </serviceProviders>
.
5. Start SOA/Admin server
 Now logging on to worklist application should work.

Mediator FIFO Resequencer across groups

Mediator FIFO Resequencer across groups not processing the messages in the correct order.

Messages placed in the queue
   group 1 - 2 messages (msg1_1 msg1_2)
   group 2 - 4 messages (msg2_3 msg2_4 msg2_5 msg2_6)
   group 3 - 3 messages (msg3_7 msg3_8 msg3_9)

Process order: msg1_1 msg1_2 msg2_3 msg2_4 msg2_5 msg2_6 msg3_7 msg3_8 msg3_9

Expected behavior:
   process 1: msg1_1 msg2_3 msg3_7 (in any order)
   process 2: msg1_2 msg2_4 msg3_8 (in any order)
   process 3: msg2_5 msg3_9 (in any order)
   process 4: msg2_6

EXPLANATION:
-------------
Re-sequencer is not intended for sequencing across groups.
Mediator re-sequencer provides sequencing of messages within a group.

As clearly mentioned in section 22.2.2.1 Overview of the FIFO Re-sequencer
of link  :
http://docs.oracle.com/cd/E21764_01/integration.1111/e10224/med_resequencer.htm#CHDGJCDD

A FIFO re-sequencer would processes messages in sequence "for each group"
based on the arrival time.
The important thing to note in the above statement is - "for each group".
What this means is , a FIFO re-sequencer  would guarantee the sequential
processing of messages based on their arrival time "within each group"

A re-sequencer group is meant to provide "compartmentalization"
(i.e)
Each group would be processed as a separate entity (thread) and not depend on
other groups.
This is required, because , a failure in processing a group would not
interfere with the progression of messages in other groups.
The re-sequencer  guarantee  is that , the sequence would be maintained
within each group.

Consider the following example using FIFO:
12:00 AM , we en-queue 2 messages -     grp1-x , grp2-x
01:00 AM , we en-queue 2 messages -     grp1-y , grp2-y
02:00 AM , we en-queue 2 messages -     grp1-z , grp2-z

Now when the re-sequencer is started , the engine only guarantees that  the
messages within  each group will be sequenced in the order of arrival time.

So in this case , the guaranteed and expected de-queue  behavior is  that  ,
for each group the sequence will be maintained on basis of the arrival time
(i.e)
For group 1 - grp1-x(12:00),grp1-y(01:00),grp1-z(02:00)
and independently
For group 2 - grp2-x(12:00),grp2-y(01:00),grp1-z(02:00)

Again , since the re-sequencer is only meant for "sequencing  within group" ,
it's possible for the instances in EM to be something like
 -> grp1-x , grp2-x, grp2-y, grp2-z, grp1-y, grp1-z

As we can see grp1-x was processed by  lets say thread 1 , but before it
could process other messages another thread  (thread 2) completed the
sequence for grp2.
However ,as guaranteed ,  within each group the sequence has been maintained
as expected(x(at 12:00) followed by y(at 01:00) followed by z(at 02:00))

Re-sequencer is not meant for "re-sequencing across groups" .

XML-22015 :ora:getProcessId(),ora:getProcessVersion()

PROBLEM:
--------
While using XPath functions like ora:getProcessId(),ora:getProcessVersion()
SOA composite is failing with XML-22015: (Error) Function 'getProcessId' not
found.


EXPLANATION:
------------
The reported exception is expected.
BPEL XPath Functions (ora:functions) are not available from the "Component Palette" in Jdev for transformation.

The only way , the ora functions could have been included in the project is by editing the XSL manually from it's source view.

Since the ora functions are not available to the transformation engine , the exception is thrown.

It's important that we design the transformations based on the available list of functions , we cannot support functions that have not been exposed , but
included by editing the source .

BPEL 10G : Fetching audit trail using BPEL API

import java.util.Hashtable;

import javax.naming.Context;

import com.oracle.bpel.client.IInstanceHandle;
import com.oracle.bpel.client.Locator;
import com.oracle.bpel.client.ServerException;
import com.oracle.bpel.client.delivery.IDeliveryService;
import com.oracle.bpel.client.util.WhereCondition;


//Additional Imports
import org.w3c.dom.*;
import com.collaxa.xml.XMLHelper;
import com.collaxa.cube.engine.test.*;
import com.collaxa.cube.xml.dom.DOMUtil;


public class AuditRetreiver {
    public AuditRetreiver() {
    }

    public static void main(String[] args) {
        Locator locator;
        try {
            Hashtable<String, String> env = new Hashtable<String, String>();
            env.put(Context.PROVIDER_URL,
                    "ormi://localhost:12401/orabpel");
            env.put(Context.SECURITY_PRINCIPAL, "oc4jadmin");
            env.put(Context.SECURITY_CREDENTIALS, "welcome1");
            env.put(Context.INITIAL_CONTEXT_FACTORY,
                    "com.evermind.server.rmi.RMIInitialContextFactory");
            locator = new Locator("default", env );
            locator.lookupService(IDeliveryService.SERVICE_NAME);

            long cikey = 140001;

            WhereCondition whereCikey = new WhereCondition("cikey = ?");
            whereCikey.setLong(1, cikey);

            IInstanceHandle[] instanceHandles = locator
                    .listInstances(whereCikey);

            for (int i = 0; i < instanceHandles.length; i++) {
                IInstanceHandle iInstanceHandle = instanceHandles[i];

            //Get the complete audit trail
            Element auditTrail = XMLHelper.parse(iInstanceHandle.getAuditTrail());

            //In case we want to print the audit trail
            System.out.println("Audit Trail : \n"+DOMUtil.toXML(auditTrail).toString());

            //Get the list of <details> element from <audit-trail>
            NodeList details = auditTrail.getElementsByTagName("details");

            //Get the first <details> element - this element would
            //indicate if reference details are stored in AUDIT_DETAILS
            //(e.g) <details id="0" />
            Element detailsElement = (Element)details.item(0);
            String detailId = detailsElement.getAttribute("id");

            //if detailId!=null , get the details stored in AUDIT_DETAILS table
            if (detailId!=null && !(detailId.trim().equals("")) )
            {
                System.out.println("Getting Audit Details from: AUDIT_DETAILS \n "+ iInstanceHandle.getAuditDetails(0));
            }
            //if detailId==null ,all details stored in AUDIT_TRAIL itself
            //proceed with getting the details from AUDIT_TRAIL
            else
            {
                System.out.println("Getting Audit Details from:AUDIT_TRAIL \n"+ BPELTestUtils.getElementText(detailsElement));

            }
       }

        } catch (ServerException e) {
            e.printStackTrace();
        }
        catch (Exception e) {
            e.printStackTrace();
        }

    }
}


Human Task : maximum escalation level

PROBLEM STATEMENT:
------------------
While designing the human work flow task in JDeveloper to configure the
deadlines TAB. we configure the maximum escalation level as 3.
But, this maximum escalation level is applicable for the entire task flow
duration.
Customer would like to set the maximum escalation level at the stage
participant configuration of assignment TAB. 


EXPLANATION:
-----------
This behavior is expected.

The "escalation policy" is applicable to the task as a whole and not for individual participants.

This can be confirmed by checking the Routing Slip of the Human Task
(HumanTask1.task , from Jdev source mode)
 <globalConfiguration>
<escalationPolicy renewalDurationType="STATIC" renewalDuration="PT2M">
    <numberOfTimesEscalated type="STATIC">3</numberOfTimesEscalated>
</escalationPolicy>
 </globalConfiguration>

As can be seen the "numberOfTimesEscalated" is configured at the
globalConfiguration level.
(i.e) escalation policy is applicable for the whole Task.
Participant level escalation policy  is not implemented/supported.

Moreover , section 27.2.1.4 Task Deadlines in  link
http://docs.oracle.com/cd/E14571_01/integration.1111/e10224/bp_introhwf.htm
clearly states that the deadlines are associated with a task :
"Human workflow supports the specification of deadlines associated with a
task."

To clarify further ,
The "Escalation Level" set would determine the number of times the "task will
be escalated" , and is not applicable per/participant.

SOA : Configuration Wizard Known Issue

Environment :  11.1.1.6.0 / Linux.

Start the domain creation GUI with ./config.sh
Click next (to create a domain)
Check Oracle Service Bus OWSM Extension - 11.1.1.6 [Oracle_OSB1]
A popup comes up with Error CFGFWK-64072
Click OK, and Next

The problem happens and at this point, we would be unable to change the domain name
as cannot type anything at all.

The issue only happens when the config wizard is executed under a specific circumstance .
JDK1.7 - PUTTY - X-Server (on Windows) - Fails
JDK1.6 - PUTTY - X-Server (on Windows) - Works
JDK1.7 - VNC - Linux - Works
JDK1.7 - Windows - Works


We've confirmed that the same behavior can also be reproduced by executing
the config script in a vanilla WLS 10.3.6.0 environment.

FTP Adapter : BatchNotificationHandler

PROBLEM STATEMENT:
-------------------
BatchHandler Notifications do not appear to be working as expected and/or
documented in
http://docs.oracle.com/cd/E23943_01/integration.1111/e10231/adptr_file.htm

The batch notification callback configured via binding.jca property

<binding.jca config="DebatchingIn_ftp.jca">
<property name="batchNotificationHandler">
oracle.sample.SampleBatchCalloutHandler</property>
</binding.jca>

does not appear to be invoked.


SOLUTION:
---------
please make the following changes to the binding.jca in the SOA composite :
1. Property Name = batchNotificationHandler
2. Value = java://{custom_class}

(i.e)
<property name="batchNotificationHandler">
java://oracle.sample.SampleBatchCalloutHandler
</property>

With this changes , the batching notification call out custom class methods are being invoked.


On invoking the composite , the log  has the
following entries :
13/06/2012 11:13:37 AM
oracle.sample.SampleBatchCalloutHandler onInitiateBatch
INFO:  Entering onInitiateBatch
13/06/2012 11:13:37
AM oracle.sample.SampleBatchCalloutHandler onCompletedBatch
INFO:  Entering onCompletedBatch
13/06/2012 11:13:37
AM oracle.sample.SampleBatchCalloutHandler onCompletedBatch
INFO:  Exiting onCompletedBatch

SOA 10G : EJB transaction-timeout

Setting individual EJB transaction-timeout:
A. Unzip the ejb_ob_engine.jar file located under
SOA_ORACLE_HOME/j2ee/home/applications/orabpel
B. Modify the META-INF/orion-ejb-jar.xml file inside by changing
transaction-timeout on all the EJBs.
Set transaction-timeout to 3600
C. Rejar ejb_ob_engine.jar.
D. Rename
$SOA_Home\j2ee\oc4j_soa\application-deployments\orabpel\ejb_ob_engine
Restart the OC4J container.
[On restart application-deployments\orabpel\ejb_ob_engine will be recreated
with the modified transaction-timeout values]


2.Setting Global transaction-timeout
A. Remove all the transaction-timeout attributes from the
META-INF/orion-ejb-jar.xml file
(See the previous steps for accessing this file).
B. Change the transaction-timeout value in
SOA_ORACLE_HOME/j2ee/home/config/transaction-manager.xml
C. Restart the OC4J container.

10g BPEL retrieve statistics using custom java code

How to retrieve statistics details from the 10g BPEL Administration console by using custom java code.

Java Code :

import com.collaxa.common.util.Statistics;

import java.util.Properties;

import com.collaxa.xml.XMLHelper;

import com.oracle.bpel.client.BPELProcessId;
import com.oracle.bpel.client.IBPELDomainHandle;
import com.oracle.bpel.client.IBPELProcessHandle;
import com.oracle.bpel.client.IInstanceHandle;
import com.oracle.bpel.client.Locator;
import com.oracle.bpel.client.NormalizedMessage;
import com.oracle.bpel.client.delivery.IDeliveryService;
import com.collaxa.cube.fe.util.FormatUtils;

import com.oracle.bpel.client.util.WhereCondition;

import com.oracle.bpel.client.util.WhereConditionHelper;

import java.text.SimpleDateFormat;

import java.util.Calendar;
import java.io.*;

public class GetBPELStats {
    public static final String DATE_FORMAT_NOW = "dd.MM.yyyy HH:mm:ss:SSS";
   
    public GetBPELStats() {
    }

    public static void main(String[] args) {

        if ((args != null) & (args.length != 0)) {
            System.out.println("Usage: GetBPELStats");
            System.exit(1);
        } else {
            try {
                // properties in the classpath
                Properties props = new java.util.Properties();

                // read the properties file
                java.net.URL url =
                    ClassLoader.getSystemResource("context.properties");
                props.load(url.openStream());
                //System.out.println(props);

                String bpeldomain = props.getProperty("bpeldomain");
                if (bpeldomain == null) {
                    System.out.println("BPEL domain not specified in context.properties, assuming 'default'");
                    bpeldomain = "default";
                }

                String bpelpassword = props.getProperty("bpelpassword");
                if (bpelpassword == null) {
                    System.out.println("BPEL password not specified in context.properties, assuming ********");
                    bpeldomain = "welcome1";
                }

                // get a connection to the server
                Locator locator = new Locator(bpeldomain, bpelpassword, props);

                IBPELDomainHandle domain = locator.lookupDomain();
               
                System.out.println("GetBPELStats for SOA10g ");
                Calendar cal = Calendar.getInstance();
                SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
                System.out.println("Date: " + sdf.format(cal.getTime()));
               
               
                System.out.println("===> Successfully connected to domain " +
                                   bpeldomain);
               
                Statistics[] asyncStats = domain.getAsyncStatistics();
               
                System.out.println("------------------------------");
                System.out.println("Async BPEL Domain Statistics:");
                for(int i = 0; i < asyncStats.length; i++)
                {
                    Statistics stat = asyncStats[i];
                    System.out.println((new StringBuilder()).append("<key name=\"").append(stat.getKey()).append("\"><stats count=\"").append(stat.getCount()).append("\" min=\"").append(stat.getMin()).append("\" max=\"").append(stat.getMax()).append("\" average=\"").append(stat.getAvg()).append("\"/></key>").toString());
                }
                if (asyncStats.length==0)
                {
                    System.out.println("There are no Async BPEL Domain Statistics:");
                }
                System.out.println("------------------------------");

               
                Statistics[] syncStats = domain.getSyncStatistics();
                System.out.println("------------------------------");
                System.out.println("Sync BPEL Domain Statistics:");
                for(int i = 0; i < syncStats.length; i++)
                {
                    Statistics stat = syncStats[i];
                    System.out.println((new StringBuilder()).append("<key name=\"").append(stat.getKey()).append("\"><stats count=\"").append(stat.getCount()).append("\" min=\"").append(stat.getMin()).append("\" max=\"").append(stat.getMax()).append("\" average=\"").append(stat.getAvg()).append("\"/></key>").toString());
               

                }
                if (syncStats.length==0)
                {
                    System.out.println("There are no Sync BPEL Domain Statistics:");
                }
                System.out.println("------------------------------");


                Statistics[] requestStats = domain.getRequestStatistics();
                System.out.println("------------------------------");
                System.out.println("BPEL Engine Requests Statistics:");
                for(int i = 0; i < requestStats.length; i++)
                {
                    Statistics stat = requestStats[i];
                    System.out.println((new StringBuilder()).append("<key name=\"").append(stat.getKey()).append("\"><stats count=\"").append(stat.getCount()).append("\" min=\"").append(stat.getMin()).append("\" max=\"").append(stat.getMax()).append("\" average=\"").append(stat.getAvg()).append("\"/></key>").toString());
                }
                if (requestStats.length==0)
                {
                    System.out.println("There are no PEL Engine Requests Statistics:");
                }
                System.out.println("------------------------------");


                //To clear the statistics from memory
                //domain.clearStatistics();


            } catch (Exception e) {
                System.out.println("Exception in GetBPELStats: " + e);
                e.printStackTrace();
            }
        }

    }

}



EXPLANATION:
------------------
The above class relies on BPELDomainHandle object and obtains the statistics using the
following API calls:
domain.getAsyncStatistics   : Async BPEL Domain Statistics
domain.getSyncStatistics    : Sync BPEL Domain Statistics
domain.getRequestStatistics : Engine Requests Statistics

The statistics are built and  stored in the memory using HashMaps.
The engine relies on the data in the HashMaps and calculates the statistics
at runtime.
When we clear the statistics , the data in the HashMaps are cleared.
To clear the statistics from memory using Java Code , we can use
-> domain.clearStatistics();

The "Statistics" page(jsp) in BPEL Administration page , uses the same API's
as GetBPELStats.java .In addition the JSP page formats the statistics are
presents them as a Tree(hierarchy) structure.

SOA : Tranasaction/Scope/Rollback

PROBLEM STATEMENT:
------------------
Transaction in a scope doesn't rollback when a fault is received from a partner link.

1.AsynchronousBPEL is 1-way async process which inserts records into test2 table
2.SynchronousBPEL is sync bpel process inserting records into test1 table,
transaction set to "required" which gets executed in same transaction from
parent
3.col1 on both tables will always have a constant value as "Test" assignedin BPEL
4.Col2 will have the input value passed from AsyncBPEL process 

After updating the test1 table with a duplicate entry, the test2 table
throws a key violation. This should cause the test1 table value to be
rolled back.

EXPLANATION:
---------
Though the user case reproduces the issue , the cause lies with the design of the BPEL process itself .

The CatchAll{} fault handler in the main scope of AsynchronousBPEL process prevents the fault/exception from bubbling up to the engine .
Since the fault is handled by the BPEL process  , the engine is unaware of the exception -
causing the transaction in SynchronousBPEL to be not rolled back.

This behavior can be verified by looking through the audit trail.
In the audit trail we will observe that the state of the SynchronousBPEL 
would remain as "Completed" meaning that , the transaction in SynchronousBPEL
 was never rolled back.

Until the BPEL engine is notified of the underlying exception , it cannot
ascertain the cause and rollback the dependent transactions.


To achieve this , the use case will have to "Rethrow" the fault from
CatchAll{} fault handler in the main scope of AsynchronousBPEL process.This
way , the engine will be notified of the exception and appropriate action
initiated(In this case ,transaction rollback of SynchronousBPEL).
Of course , this rethrow can happen after the required action has been
undertaken
(e.g) notification via email.
  <faultHandlers>
    <catchAll>
      <sequence name="Sequence1">
        <invoke name="Notify"/>    <!--  action on the fault -->
        <rethrow name="Rethrow"/>  <!-- throw back the exception to the
engine --->
      </sequence>
    </catchAll>
  </faultHandlers>


With this change in place , a failure in inserting data into
table test 2(Invoke2) would also result in rollback of the insert into table
test1.

OSB Adapter Framework : Execution Boundaries


Consider the following scenario where OSB projects use the same WM (WorkManager)
This WM has been defined with a max-threads-constraint of  <count>1</count>.

Customer has 2 AQ projects , however the second project fails to start up with exception:
<BEA-002936> <maximum thread constraint test.MaxThreadsConstraint is reached>

The customer's expectation is for both the projects to use individual WM threads.

The above expectation is incorrect.To understand the behavior , we should understand
the execution boundaries of  Adapter Framework:

PHASE 1: executed only once
The first execution comes into play only once , when the first Adapter proxy is activated.
During this phase , a conditional check is performed to confirm the state of the Adapter.
If the state is not "STARTED"(i.e) no previous proxy with AQAdapter  has been activated, the Adapter is initialized
with a BootStrap WorkManager and its state is updated to "STARTED".

This BootStrap WorkManager is then used by all AQ proxy services during dequeue activation.


PHASE 2: executed for each AQ proxy service
Following phase 1 , the second phase is executed wherein , the dequeue agent is activated using the WM from the first phase.
When the next AQ Adapter proxy is activated , the first phase is skipped since state is "STARTED" and the
execution enters the second phase where the dequeue agent is activated using the same WM (from the first phase)

As we can see , the adapter framework uses the same WorkManager for all the dequeue agents.


I've performed multiple tests to prove the above theory :
CASE 1:
Create 2 WM's - Project1.WorkManager & Project2.WorkManager
Create 2 MaxThreadConstraints - Project1.MaxThreadConstraint & Project2.MaxThreadConstraints
Associate
    Project1.MaxThreadConstraints to Project1.WorkManager
    Project2.MaxThreadConstraints to Project2.WorkManager

Create 2 Proxy Services - Project1.ProxyServices & Project2.ProxyServices
Associate
  Project1.ProxyServices with Project1.WorkManager
  Project2.ProxyServices with Project2.WorkManager

Enable Project1.ProxyServices , we should observe that the dequeue agent is activated
Enable Project2.ProxyServices , we should observe that the dequeue agent is not activated , and
the following WARNING message appears in the log
<BEA-002936> <maximum thread constraint Project1.MaxThreadConstraint is reached>


As we can see, the constraint being mentioned is Project1.MaxThreadConstraint
(i.e) the constraint belonging to the WM which was loaded first.

Without restarting the server deactivate Project2.ProxyServices
Modify the WM to point to "default"
Reactivate the proxy.
We will still observe that the dequeue agent is not activated 
      - this is because the WM used by the adapter is still Project1.WorkManager.
      - this also confirms that the runtime WM change to the proxy service has no effect
        on the underlying Adapter layer.

CASE 2:
Following CASE 1,deactivate both the proxies and  restart the server.
Activate Project2.ProxyServices (which uses the default WM)
Activate Project1.ProxyServices (which uses Project1.WorkManager)
Observe that both the dequeue agents are activated.

This is because , the first WM to be associted to the Adapter is "default" which does not have an MaxThreadConstraint set.
Even though Project1 refers to a custom WM , the Adapter would still end up using the  "default" WM.

POSSIBLE SOLUTION:
-----------------
Since we cannot rely on the order of proxy service (and hence the associated
WM) startup ,we should
create one custom WM with suitable MaxThreadConstraints value.
Associating all the proxies with the same custom WM should resolve the issue.

Email response from SOA Adapter base development :
yes , only one workmanager is handed down to the JCA framework as per design.

SOA Human-Task : setting expiry at runtime

Steps to set expiry at runtime for human tasks

1. create and initiate a task with expiry time as 5 mins
   lets say the task was initiated at 6:00 PM
2. From the BPM worklist/workspace confirm that the task's expiry time is 6:05 PM 
3. From BPM worklist/workspace Admintsration > Task Configuration Page  confirm that the expiry time is 5 mins
4. Edit the task from Task Configuration Page and modify the expiry time  to 10 mins
5. Click on "Save" button, observe the following confirmation
   Task metadata for this task saved successfully
6. Click on "Commit" button, observe the following confirmation
   Task metadata for this task commited successfully
7. initiate another task from EM
   lets say the task was initiated at 6:10 PM
8. From the BPM worklist/workspace confirmed that the task's expiry time is 6:20 PM


NOTE:
-----
We will have to "Save" the changes followed by "Commit"
- the change gets persisted into the dehydration store only when both these operations are performed.

SOA 11.1.1.6 mybatis with SOA Composites

SOA 11.1.1.6 supports spring framework 2.5.6 , while , mybatis-spring requires spring 3.0.0 or higher.
Hence , it would not be possible to use mybatis within SOA composites.

Even if we include spring-beans-3.1.0 libraries with the composite (under SCA-INF/lib)
we would encounter exception MalformedParameterizedTypeException during
deployment because  the fabric engine would only have access to the spring library from the classpath
[spring library used by fabric
  : MW_HOME/common/modules/org.springframework_2.5.jar]


mybatis source files are all compiled using spring 3.0 libraries.
The mybatis class SqlSessionFactoryBean implements a parametrized
FactoryBean<SqlSessionFactory> which is only available in spring-beans 3.0
and not 2.5.6.

So when the fabric engine tries to create a bean for SqlSessionFactoryBean
using spring 2.5.6 libraries , it fails with
MalformedParameterizedTypeException .


CODE SNIPPETS:
---------------
mybatis  :
org.mybatis.spring.SqlSessionFactoryBean implements
FactoryBean<SqlSessionFactory>

spring 3.0 :
org.springframework.beans.factory.public interface FactoryBean<T>

spring 2.5.6 :
org.springframework.beans.factory.public interface FactoryBean

Since mybatis is not compatible with spring 2.5.6 and SOA does not support
spring 3.0 as yet , we cannot use mybatis  with SOA. I've confirmed that SOA
11.1.1.6 does not support spring 3.0 from both the product management and
spring development team.

SOA 10.1.3.5 on WLS as a windows service

PROBLEM STATEMENT:
-----------------
When attempting to start SOA 10.1.3.5 on WLS as a windows service , the following exception
is observed:
java.lang.NoClassDefFoundError: oracle/tip/adapter/db/IDBConnection
java.lang.NoClassDefFoundError: oracle/tip/adapter/db/DBConnectionFactory
on: java.lang.NoClassDefFoundError: oracle/toplink/platform/server/was/WebSphere_5_1_Platform.
java.lang.NoClassDefFoundError: oracle/tip/esb/model/repository/Repository
java.lang.NoClassDefFoundError: com/cfluent/log4j/Category
etc.....


EXPLANATION & RESOLUTION
-------------------------
The NoClassDefFoundError is encountered because some required libraries are missing from the CLASSPATH.
Check for the following pointers:

A. Missing absolute directory in java.class.path -
java.class.path = \toplink\jlib\toplink.jar;\lib\xmlparserv2.jar;........
\bpel\domains\default\tmp\.generated;\bpel\system\classes ......
\bpel\lib\oracle.soa.10.1.3.5.0.jar;\soa\connectors\oracle.soa.adapters.10.1.3
.5.0.jar.........

B. Missing absolute directory in orabpel.home/oraesb.home -
orabpel.home = \bpel
oraesb.home = \integration\esb

C. Missing entry for environment variable : oracle.home


The classpath entries and the environment variables (orabpel.home ,
oraesb.home,oracle.home) should be preceded by absolute SOA_HOME directory.
This value is made available via the environment variable SOA10G_ORACLE_HOME
in setDomainEnv.cmd

Snippet of setDomainEnv.cmd:
set SOA10G_ORACLE_HOME=C:\product\10.1.3.1\SOAWLS\OracleSOA
.....
-Doracle.home=%SOA10G_ORACLE_HOME% -Dorabpel.home=%SOA10G_ORACLE_HOME%\bpel
-Doraesb.home=%SOA10G_ORACLE_HOME%\integration\esb
.....
EXT_PRE_CLASSPATH=%SOA10G_ORACLE_HOME%\toplink\jlib\toplink.jar;%SOA10G_ORACLE
_HOME%\lib\xmlparserv2.jar
....
POST_CLASSPATH= ....
%SOA10G_ORACLE_HOME%\bpel\lib\oracle.soa.10.1.3.5.0.jar;%SOA10G_ORACLE_HOME%\s
oa\connectors\oracle.soa.adapters.10.1.3.5.0.jar ....


The value of SOA10G_ORACLE_HOME is used in setDomainEnv.cmd to prepend the
SOA_HOME to the variables. However , in the somes cases the value for
SOA10G_ORACLE_HOME seems to be empty ("") , hence the system properties ,
classpath entries etc.. are built incorrectly.


SOLUTION 1: RE-INSTALL SOA AS WINDOWS SERVICE
----------------------------------------------
Please make sure that the value for SOA10G_ORACLE_HOME in setDomainEnv.cmd
points to the SOA_HOME.
(e.g)set SOA10G_ORACLE_HOME=C:\product\10.1.3.1\WLS\OracleSOA
.
Uninstall the SOA Window Service.
Re-Install the SOA Window Service
Start SOA server.
The log should indicate the environment variables as follows :
orabpel.home = C:\product\10.1.3.1\SOAWLS\OracleSOA\bpel
oracle.home = C:\product\10.1.3.1\SOAWLS\OracleSOA
oraesb.home = C:\product\10.1.3.1\SOAWLS\OracleSOA\integration\esb
.....
java.class.path =
C:\product\10.1.3.1\SOAWLS\OracleSOA\toplink\jlib\toplink.jar;C:\product\10.1.
3.1\SOAWLS\OracleSOA\lib\xmlparserv2.jar;
........
.
SOLUTION 2:MODIFY THE REGISTRY MANUALLY
---------------------------------------
From Registry Editor , navigate to
HKEY_LOCAL_MACHINE->SYSTEM->CurrentControlSet->Services->{SOA_SERVICE}->Parame
ters->
Copy the Value Data for CmdLine into a Text Editor.
[make sure to back up the original values]
Search for "-classpath" . prepend the value for SOA10G_ORACLE_HOME to the
following libraries :
{SOA10G_ORACLE_HOME}\toplink\jlib\toplink.jar;
{SOA10G_ORACLE_HOME}\lib\xmlparserv2.jar;
{SOA10G_ORACLE_HOME}\bpel\domains\default\tmp\.generated;
{SOA10G_ORACLE_HOME}\bpel\system\classes;
{SOA10G_ORACLE_HOME}\bpel\system\services\config;
{SOA10G_ORACLE_HOME}\bpel\system\services\schema;
{SOA10G_ORACLE_HOME}\integration\esb\config;
{SOA10G_ORACLE_HOME}\integration\esb\system\classes;
{SOA10G_ORACLE_HOME}\owsm\lib\custom;
{SOA10G_ORACLE_HOME}\bpel\lib\oracle.soa.10.1.3.5.0.jar;
{SOA10G_ORACLE_HOME}\soa\connectors\oracle.soa.adapters.10.1.3.5.0.jar;
.
Search for -Dorabpel.home  & -Doraesb.home . prepend the value for
SOA10G_ORACLE_HOME
-Dorabpel.home={SOA10G_ORACLE_HOME}\bpel
-Doraesb.home={SOA10G_ORACLE_HOME}\integration\esb


Add a new entry for oracle.home
-Doracle.home={SOA10G_ORACLE_HOME}

Where {SOA10G_ORACLE_HOME} = PATH_TO_SOA
(e.g) C:\product\10.1.3.1\SOAWLS\OracleSOA

Paste the modified value into CmdLine.
Start SOA server.
The log should indicate the environment variables as follows :
orabpel.home = C:\product\10.1.3.1\SOAWLS\OracleSOA\bpel
oracle.home = C:\product\10.1.3.1\SOAWLS\OracleSOA
oraesb.home = C:\product\10.1.3.1\SOAWLS\OracleSOA\integration\esb
.....
java.class.path =
C:\product\10.1.3.1\SOAWLS\OracleSOA\toplink\jlib\toplink.jar;C:\product\10.1.
3.1\SOAWLS\OracleSOA\lib\xmlparserv2.jar;
........

BPM WORKLIST User & Group Rules

Consider the following LDAP set-up:
Users - user1;user2;user3;adminuser
Group - group1

user1 & user2 are members of group1
adminuser has administrator privileges and is the owner of group1.


Use-Case 1 - User Rules:
--------------------------
1. A task is assigned to group1.
 <participant name="default.DefaultPerformer">
   <resource type="STATIC" identityType="group">group1</resource>
 </participant>
2. Logging in as adminuser(owner of group1) into BPM Workspace , navigate to
   Preferences ->  Rules -> My Rules
3. Add a new User Rule with the following action {Assign To -> user3)
4. Execute the task from BPM workspace as adminuser.


Customer's Expectation:
The rule should take effect and the task should be assigned to user3.

Observed Behavior:
The task is assigned to group1

Expected Behavior:
The task should be assigned to group1 and not user3.
.
Reason:
The rules configured (both User & Group) would come into effect only when a task reaches the actual recipient.
(i.e) for a Group Rule to execute , the task should first reach the group,
      then the rules specified for that particular group would take effect
      Similarly,for a User Rule to execute , the task should first reach the user,     
      then the rules specified for that user would take effect

In this use-case , the task is assigned to a Group(group1), since there is no
Group Rule specified for group1 , the task remains with group1.


Now ,if the customer expects to configure a User Rule for the task , then:
1. The task should be assigned to an user , lets say user1

2. Logging in as user1 into BPM Workspace , navigate to
   Preferences ->  Rules -> My Rules
3. Add a new User Rule with the following action {Assign To -> user3)

(or)

2A. Logging in as as user with administrative rights (adminuser)into BPM 
    Workspace , navigate to Preferences ->  Rules -> Other Rules 
3A. Search for "user1" ,add a new User Rule with the following action {Assign To -> user3)

In this case , the task would first reach the intended recipient(user1),then
the rules engine would check for any rules specified for that user(user1).
Since user1 has a rule , the rule would be executed and the task assigned to user3.

So , to re-iterate , When a task is assigned to a Group
 - the rules specified for the Group will take effect.
If the customer expects a User rule to be invoked , the task needs to be assigned to an user.


Use-Case 2 - Group Rules:
-------------------------
1. A task is assigned to group1.
 <participant name="default.DefaultPerformer">
   <resource type="STATIC" identityType="group">group1</resource>
 </participant>
2. Logging in as adminuser(owner of group1) into BPM Workspace , navigate to
   Preferences ->  Rules -> My Rules
3. Add a new Group Rule (under group1) with the following action {Assign To
-> user3)
4. Execute the task from BPM workspace as adminuser.

Customer's Expectation:
The rule should take effect and the task should be assigned to user3.

Observed Behavior:
The task is assigned to group1

Expected Behavior:
The rule should take effect and the task should be assigned to user3.

For Group Rules to be executed , the following conditions needs to be met:
1. The group in LDAP should have an owner specified
2. The group's owner should create the Group Rules
3. The group needs to appear in the Preferences -> Rules -> My Rules tab for
   the group owner

When these conditions are met , the conditions of the Rule gets executed as
expected.

Oracle Business Rules : Generating Xml Facts from schema - JAXB Restriction

PROBLEM STATEMENT:
-----------------
Consider the following schema structure:
<xsd:element name="Airport" type="Airport_Type"/>
<xsd:complexType name="Airport_Type">
<xsd:sequence>
      <xsd:element ref="AirportTypeCd" minOccurs="0" maxOccurs="1"/>
      </xsd:sequence>
</xsd:complexType>
<xsd:element name="AirportTypeCd" type="AirportType"/>
 <xsd:complexType name="AirportType">
<xsd:sequence>
  <xsd:element name="input" type="xsd:string"/>
 </xsd:sequence>
</xsd:complexType>


From Jdeveloper  , create business rule based on the above schema.
Click on the "Create" XML Facts Icon in Business Rules.
Add the above schema
In the "Target Classes" frame , expand the tree structure.The structure would be : 
org->test-> xml
    -> AirportType
    -> OjectFactory

Notice that the JAXB Class corresponding to element "Airport_Type" is missing.

EXPLANATION:
-------------------
The rules engine (and SOA in general) rely on glass-fish JAXB libraries for
converting XML facts to Java and vice-verse.
As per the default JAXB implementation , the JAXB engine  ignores underscore
characters in the element's name when converting XML elements to JAXB classes.
(i.e)
An element like <xsd:complexType name="Airport_Type">
would be converted to a JAXB class "AirportType.class"

In general this default behavior should not be an issue , however in this case , the schema also contains another element with name  <xsd:complexType name="AirportType">

When JAXB attempts to convert element "AirportType" into a JAXB class , it fails with the error
An error was encountered while migrating JAXB
A class/interface with the same name "org.test.AirportType" is already in use

This happens because the element Airport_Type was converted to AirportType.class as well.

The solution would  be to use a custom binding and inform JAXB to retain
underscore elements as-is when converting them to JAXB classes.

This binding customizes JAXB's default implementation to not ignore
underscore's via : <jaxb:globalBindings underscoreBinding="asCharInWord"/>

[Refer to
http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.5/tutorial/doc/JAXBUsing4.html
for more details]

Environment variables substitution in soa deployment plan

PROBLEM
---------------
1. Create a 'hello world' composite calling another hello1 composite
2. Create a deployment plan:
Jdeveloper -> composite.xml -> right click -> Generate deployment plan.
3. In the deployment plan change from
<replace>http://host:8001/soa-infra/services/default/hello1/bpelhello1_client_ep?WSDL</replace>
to
<replace>http://host:8001/soa-infra/services/default/${my_composite}/bpelhello1_client_ep?WSDL</replace>

where hello1 is changed to ${my_composite} as documented here:

4. Deploy composite.
5. Start soa_server with the following option: -Dmy_composite=hello1


During runtime the following error occurs:

<remoteFault>
<part  name="summary">
<summary>oracle.fabric.common.FabricException: Cannot read WSDL
"{http://xmlns.oracle.com/bpel_owsm_osb/hello1/BPELHello1}bpelhello1_client_ep" from Metadata Manager.: mdm-url-resolver.xml not loaded</summary>
</part>
<part  name="detail">
<detail>mdm-url-resolver.xml not loaded</detail>
</part>
</remoteFault>

SOLUTION:
---------
There are two ways to load custom properties :

OPTION 1: via System Property :oracle.soa.url.resolver.properties.file
-----------------------------------------------------------------------
Use the following system property
-Doracle.soa.url.resolver.properties.file={path_to_properties_xml}
[e.g
-Doracle.soa.url.resolver.properties.file=C:\properties.xml
]

The structure of the properties.xml would be :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<entry key="{key_name}">{value}</entry>
</properties>

[e.g
<entry key="my_composite">hello1</entry>
]


NOTE:
-----
1. We can add multiple key-value pair as multiple <entry> elements.
2. If the SOA server is being started using command line , then the system
property -Doracle.soa.url.resolver.properties.file={path_to_properties_xml}
needs to be added to JAVA_OPTIONS in startManagedServer.sh(bat)

3. If the SOA server is being started from WLS console , then the system
property -Doracle.soa.url.resolver.properties.file={path_to_properties_xml}
needs to be added to java start parameters

OPTION 2: via mdm-url-resolver.xml in fmwconfig directory
---------------------------------------------------------
Create file mdm-url-resolver.xml under {SOA_DOMAIN}\config\fmwconfig
The structure of the  mdm-url-resolver.xml  would be same as properties.xml
from OPTION 1

Restart SOA server for the changes to take effect.


NOTE:
-----
SOA first attempts to load the property file from the path specified using
oracle.soa.url.resolver.properties.file system property.
If it fails to find the system property then it attempts to load the property
file from {SOA_DOMAIN}\config\fmwconfig\mdm-url-resolver.xml.
If we decide to use OPTION 2 , then we should not set the system property.

SOA Identity Service's dependency on WLS Embedded LDAP

PROBLEM STATEMENT:
------------------
Configured a SOA managed server  that relies on the embedded LDAP.
When the managed server starts without the admin server running(MSI Mode),
there is an exception in the log showing an attempt to connect to the admin server
internal LDAP instead of using the LDAP of the current managed server.
This problem prevents the customer from using WLS in Managed Server
Independence creating a single fault point in the admin server.

The exception reported in this case is :
Caused By: oracle.security.jps.service.idstore.IdentityStoreException:
JPS-01520: Cannot initialize identity store, cause:
oracle.security.idm.ConfigurationException:
javax.naming.CommunicationException: {host}:7001 [Root exception is
java.net.ConnectException: Connection refused].
at
oracle.security.jps.internal.idstore.util.IdentityStoreUtil.getIdentityStoreFa
ctory(IdentityStoreUtil.java:172)
at
oracle.security.jps.internal.idstore.AbstractIdmIdentityStore.getIdmFactory(Ab
stractIdmIdentityStore.java:273)

where 7001 is the AdminServer port.

EXPLANATION:
-----------
The exhibited behavior is expected and is not a product defect.
When using embedded LDAP , the Admin Server should be up and running for
SOA's authorization and look-up services to work.
This issue has already been dealt with in
The Admin server must be up for the user/role API's to work, hence in the MSI
mode we are unable to access the embedded LDAP.
The same information is also available in note :
Can not Login to BPMWorkspace application when the admin server is down [ID
1362545.1]

NOTE:
-----
If the customers wants SOA to work in MSI mode , they should set up an
external LDAP server and not reply on embedded LDAP.

DETAILED UPDATE:
----------------
When a managed server is started in MSI mode , the Embedded LDAP files are
copied over from the Admin Server to the managed server
 - this LDAP detail would be used by the managed server for authentication.
[
This is the reason why authentication would work in SOA in-spite of Admin
Server being down , this can be confirmed by accessing
http://{host}:{port}/soa-infra
]
However , following authentication , some SOA applications would also perform
authorization & look-up [BPM , Worklist application etc ...].
Authorization/look-up functionality of SOA requires access to LDAP server.
Since embedded LDAP  server is hosted on Admin Server , Admin Server  needs
to be up and running for authorization to work.
To put it in generalized terms , the LDAP server (embedded or external)
should be accessible for SOA server to authorize users/groups/roles etc ...

Fault Framework : Sync Process vs Async Process

I've dealt with many cases with SOA fault framework where the customer claims that scheduled recoveries don't work.
As an example :
Sync BPEL1 invokes Sync BPEL2.BPEL2 throws a fault and BPEL1 has fault policies defined as follows :
<faultName>
    <condition>
    <action ref="ora-retry"/>
    </condition>
</faultName>

<Action id="ora-retry">
        <retry>
          <retryCount>3</retryCount>
          <retryInterval>10</retryInterval>
          <exponentialBackoff/>
          <retryFailureAction ref="send-notification"/>
          <!-- retrySuccessAction ref="ora-errorQ"/ -->
        </retry>
</Action>

The expectation is that during fault handling , the framework should kick in and perform a retry thrice.However no retries are performed.


EXPLANATION:
------------------- The exhibited behavior is expected. Fault Frameworks works for asynchronous invocations only.
 (i.e) The caller BPEL should be asynchronous

 Sync Invocations request and wait for the response (response could be faults)  on the same thread (say Thread A),while Fault framework takes action on a new  thread(Thread B)

 The solution would be to use an Async BPEL processes.