Monday, February 18, 2013

Error handling using EDN-reuse code -Soa 11g


In my project we had used EDN event delivery network in SOA 11g for error handling.
We created an Error event and with a error message structure .
Eg: HelloPlatformErrorEvent, so I will be listing down the entries that you will need to implement error handling across the processes .The code is reusable and will take care skeletal common error handling.
The good thing with using EDN in errorhandling is we can have multiple consumers consuming the event and do different processing. Since EDN is fully supported in SOA 11g , the overheads of publish and subscribe /configurations will not be bothering us. We need to create an event and consumers can receive events .So if we can have multiple consumer bpel’s each doing different functionality ,one can write a file,one process writing to DB, once sending notifications. So we have plugged out the error handling/logging mechanism out of the processes. Consumers can be enables/disabled separately based on requirement.

Steps for reusing the event driven error event codes

Here for example the
event  :  HelloPlatformErrorEvent,
edl file : HelloPlatformErrorEvent
Message structure :HelloPlatformErrorEvent.xsd
Since it’s used across composites, the file will uploaded/accessed from MDS.

Composite.xml

·         Add to imports

<import namespace="http://schemas.oracle.com/events/edl/HelloPlatformErrorEvent"
          location="oramds:/apps/HelloPlatform/Events/edl/HelloPlatformErrorEvent.edl"
          importType="edl"/>

·         Add to component (bpel)
    <business-events>
      <publishes xmlns:pub1="http://schemas.oracle.com/events/edl/HelloPlatformErrorEvent"
                 name="pub1:HelloPlatformErrorEventMessage"/>
    </business-events>

. bpel file

·         Add to namespaces
         xmlns:bperrmsg="http://xmlns.oracle.com/HelloPlatform/ErrorMessage/V1"
         xmlns:errorEvent="http://schemas.oracle.com/events/edl/HelloPlatformErrorEvent"
·         Add to imports
<import namespace="http://xmlns.oracle.com/HelloPlatform/ErrorMessage/V1"
          location="oramds:/apps/HelloPlatform/Events/schema/HelloPlatformErrorEvent.xsd"
          importType="http://www.w3.org/2001/XMLSchema"/>

·          Add to Variables
<variable name="PublishHelloPlatformErrorEvent"
              element="bperrmsg:HelloPlatformErrorEventMessage"/>
·         Add inside catchall
The assign values will vary based on your message structure
       
<sequence name="ErrorSequence">
  <assign name="assignErrorEvent">
          <copy>
            <from>ora:getFaultName()</from>
            <to>$PublishHelloPlatformErrorEvent/bperrmsg:ErrorDetails/bperrmsg:ErrorCode</to>
          </copy>
          <copy>
            <from>ora:getConversationId()</from>
            <to>$PublishHelloPlatformErrorEvent/bperrmsg:InstanceDetails/bperrmsg:ConversationId</to>
          </copy>
          <copy>
            <from>ora:getInstanceId()</from>
            <to>$PublishHelloPlatformErrorEvent/bperrmsg:InstanceDetails/bperrmsg:InstanceId</to>
          </copy>
          <copy>
            <from>ora:getCompositeName()</from>
            <to>$PublishHelloPlatformErrorEvent/bperrmsg:InstanceDetails/bperrmsg:CompositeName</to>
          </copy>
          <copy>
            <from>ora:getProcessId()</from>
            <to>$PublishHelloPlatformErrorEvent/bperrmsg:InstanceDetails/bperrmsg:ProcessName</to>
          </copy>
          <copy>
            <from>ora:getFaultAsString()</from>
            <to>$PublishHelloPlatformErrorEvent/bperrmsg:ErrorDetails/bperrmsg:ErrorText</to>
          </copy>
          <copy>
            <from>'Error occured in TaskExecutionFetchPendingTasksProcess'</from>
            <to>$PublishHelloPlatformErrorEvent/bperrmsg:ErrorDetails/bperrmsg:ErrorMessage</to>
          </copy>
          <copy>
            <from>true()</from>
            <to>$PublishHelloPlatformErrorEvent/bperrmsg:ErrorHandlerOptions/bperrmsg:PersistMsgOnDB</to>
          </copy>
          <copy>
            <from>true()</from>
            <to>$PublishHelloPlatformErrorEvent/bperrmsg:ErrorHandlerOptions/bperrmsg:SendNotification</to>
          </copy>
        </assign>       
<invoke name="invokePublishHelloPlatformErrorEvent"
                bpelx:eventName="errorEvent:HelloPlatformErrorEventMessage"
                inputVariable="PublishHelloPlatformErrorEvent"
                bpelx:invokeAsDetail="no"/>
        <exit name="ProcessExit"/>
      </sequence>
   
That’s it for today. Thanks to Ram,Ravi for the coming up this model.

No comments: