{"id":2708,"date":"2011-07-18T10:21:17","date_gmt":"2011-07-18T15:21:17","guid":{"rendered":"http:\/\/jianmingli.com\/wp\/?p=2708"},"modified":"2015-04-17T13:56:35","modified_gmt":"2015-04-17T18:56:35","slug":"soa-11g-tutorial-policy-based-fault-handling","status":"publish","type":"post","link":"https:\/\/jianmingli.com\/wp\/?p=2708","title":{"rendered":"SOA 11g Tutorial: Policy Based Fault Handling"},"content":{"rendered":"<p>This is part of the <a href=\"?p=1924\">Oracle SOA11g hands on tutorials<\/a>.<\/p>\n<span id=\"Overview\"><h2>Overview<\/h2><\/span>\n<p>* See <a href=\"?p=1740\">this post<\/a><\/p>\n<span id=\"Fault_Types\"><h3>Fault Types<\/h3><\/span>\n<span id=\"System_Faults\"><h4>System Faults<\/h4><\/span>\n<p>* Examples<br \/>\n&#8211; Service not available<br \/>\n&#8211; Network failure<\/p>\n<span id=\"Business_Faults\"><h4>Business Faults<\/h4><\/span>\n<p>* Examples<br \/>\n&#8211; Invalid data<br \/>\n&#8211; Violation of business rules<\/p>\n<span id=\"Fault_Handling_Policies\"><h3>Fault Handling Policies<\/h3><\/span>\n<p>* They are attached to composite.<br \/>\n* They are not defined in code.<\/p>\n<span id=\"Define_a_Policy\"><h3>Define a Policy<\/h3><\/span>\n<p>* Fault policies are defined in a file called fault-policies.xml.<br \/>\n* Fault policies are attached to composite via a binding file called fault-bindings.xml.<br \/>\n* A fault policy consists of:<br \/>\n&#8211; Fault policy name<br \/>\n&#8211; A list of faults<br \/>\n&#8211; A set of fault conditions<br \/>\n&#8211; A set of fault recovery actions<\/p>\n<span id=\"Simulate_Service_Unavailable\"><h2>Simulate Service Unavailable<\/h2><\/span>\n<span id=\"Shutdown_validateioniForCC_Service\"><h3>Shutdown validateioniForCC Service<\/h3><\/span>\n<p>* Login EM<br \/>\n* Click validationForCC application (SOA -> soa-infra -> default -> validationForCC[1.0])<br \/>\n* On right panel, click Shut Down&#8230; button and click yes button on confirmation dialog.<\/p>\n<span id=\"Test_POProcessing_App\"><h3>Test POProcessing App<\/h3><\/span>\n<p>* Input message<\/p>\n<pre lang=\"xml\">\r\n<soap:Envelope xmlns:soap=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\">\r\n    <soap:Body xmlns:ns1=\"http:\/\/xmlns.oracle.com\/ns\/order\">\r\n        <ns1:PurchaseOrder>\r\n            <ns1:CustID>1111<\/ns1:CustID>\r\n            <ns1:ID>2222<\/ns1:ID>\r\n            <ns1:productName>iPod shuffle<\/ns1:productName>\r\n            <ns1:itemType>Electronics<\/ns1:itemType>\r\n            <ns1:price>145<\/ns1:price>\r\n            <ns1:quantity>30<\/ns1:quantity>\r\n            <ns1:status>Initial<\/ns1:status>\r\n            <ns1:ccType>Mastercard<\/ns1:ccType>\r\n            <ns1:ccNumber>1234-1234-1234-1234<\/ns1:ccNumber>\r\n        <\/ns1:PurchaseOrder>\r\n    <\/soap:Body>\r\n<\/soap:Envelope>\r\n<\/pre>\n<p>* Click Launch Flow Trace button to see the message flow.<\/p>\n<pre>\r\nFaulted while invoking operation \"execute\" on provider \"getCreditCardStatus\". \r\n<\/pre>\n<span id=\"Create_a_Fault_Policy\"><h3>Create a Fault Policy<\/h3><\/span>\n<p>* Create a new XML file named fault-policies.xml in POProcessing application:<\/p>\n<pre lang=\"xml\">\r\n<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n<faultPolicies xmlns=\"http:\/\/schemas.oracle.com\/bpel\/faultpolicy\">\r\n  <faultPolicy version=\"2.0.1\" \r\n\t       id=\"POProcessingFaults\"\r\n               xmlns:env=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\"\r\n               xmlns:xs=\"http:\/\/www.w3.org\/2001\/XMLSchema\"\r\n               xmlns=\"http:\/\/schemas.oracle.com\/bpel\/faultpolicy\"\r\n               xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\">\r\n    <Conditions>\r\n      <!-- Step #1: Add your fault handler for remote fault here: -->\r\n    <faultName xmlns:bpelx=\"http:\/\/schemas.oracle.com\/bpel\/extension\"  \r\n        name=\"bpelx:remoteFault\">     \r\n        <condition>\r\n            <action ref=\"ora-human-intervention\"\/>\r\n       <\/condition>\r\n    <\/faultName>\r\n      \r\n     <!-- Step #2: Add your fault handler for binding fault here: -->\r\n     \r\n     <!-- Step #3: Add your fault handler for mediator faults here: -->\r\n          \r\n    <\/Conditions>\r\n    \r\n    <Actions>\r\n      <!-- Step #4: Add the Action definition for handling mediator fauls using custom java here:-->\r\n      \r\n      <!-- Custom Java Handler: Logs the fault details to a log file -->\r\n      <Action id=\"my-java-handler\">\r\n        <javaAction className=\"soatraining.faulthandling.MyFaultHandler\"\r\n                    defaultAction=\"ora-terminate\" propertySet=\"myProps\">\r\n          <returnValue value=\"OK\" ref=\"ora-rethrow-fault\"\/>\r\n        <\/javaAction>\r\n      <\/Action>\r\n      \r\n      <!-- Retry -->\r\n      <Action id=\"ora-retry\">\r\n        <retry>\r\n          <retryCount>4<\/retryCount>\r\n          <retryInterval>2<\/retryInterval>\r\n          <exponentialBackoff\/>\r\n        <\/retry>\r\n      <\/Action>\r\n      \r\n      <!-- Rethrow action -->\r\n      <Action id=\"ora-rethrow-fault\">\r\n        <rethrowFault\/>\r\n      <\/Action>\r\n      \r\n      <!-- Human Intervention -->\r\n      <Action id=\"ora-human-intervention\">\r\n        <humanIntervention\/>\r\n      <\/Action>\r\n      \r\n      <!-- Terminate -->\r\n      <Action id=\"ora-terminate\">\r\n        <abort\/>\r\n      <\/Action>\r\n      \r\n    <\/Actions>\r\n    \r\n    <!-- Property sets used by custom Java actions -->\r\n    <Properties>\r\n      <!-- Property set for MyFaultHandler customer java action -->\r\n      <propertySet name=\"myProps\">\r\n        <property name=\"logFileName\">myfaulthandler.log<\/property>\r\n        <property name=\"logFileDir\">c:\\po\\log<\/property>\r\n      <\/propertySet>\r\n      \r\n      <!-- Step #5: Add new property set for MyFaultHandler for logging Mediator faults here:-->\r\n\r\n    <\/Properties>\r\n  <\/faultPolicy>\r\n<\/faultPolicies>\r\n<\/pre>\n<p>* Create a new XML file named fault-bindings.xml in POProcessing application. This file binds POProcessingFaults policy to composite.xml since they reside in the same directory.<\/p>\n<pre lang=\"xml\">\r\n<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n<faultPolicyBindings version=\"2.0.1\"\r\n                     xmlns=\"http:\/\/schemas.oracle.com\/bpel\/faultpolicy\"\r\n                     xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\">\r\n  <composite faultPolicy=\"POProcessingFaults\"\/>\r\n<\/faultPolicyBindings>\r\n<\/pre>\n<p>* Handle all remoteFault occurrences<\/p>\n<pre lang=\"xml\">\r\n<faultName xmlns:bpelx=\"http:\/\/schemas.oracle.com\/bpel\/extension\"  \r\n    name=\"bpelx:remoteFault\">     \r\n    <condition>\r\n        <action ref=\"ora-human-intervention\"\/>\r\n   <\/condition>\r\n<\/faultName>\r\n<\/pre>\n<span id=\"Test_Fault_Policy\"><h3>Test Fault Policy<\/h3><\/span>\n<p>* Redeploy POProcessing application<br \/>\n* Retry test input xml fle<br \/>\n* Click Launch Flow Trace button to see the message flow.<\/p>\n<pre>\r\n[FAULT RECOVERY] Marked Invoke activity as \"pending manual recovery\".\r\n<\/pre>\n<span id=\"Manual_Recover\"><h3>Manual Recover<\/h3><\/span>\n<p>* Start validationForCC application<\/p>\n<span id=\"Retry\"><h3>Retry<\/h3><\/span>\n<p>* Click on last POProcessing instance ID to open flow trace page.<br \/>\n* Click approveLargeOrder BPEL process<br \/>\n* Click Fault tab<br \/>\n* Click on the row containing the previous fault.<br \/>\n* Click Recover button<br \/>\n* Click on Yes on confirmation dialog<br \/>\n* Check that process is recovered.<\/p>\n<span id=\"Handle_BPEL_Exceptions\"><h2>Handle BPEL Exceptions<\/h2><\/span>\n<p>* Simulate credit card validation application error.<br \/>\n* Learn how to handle BPEL exception.<\/p>\n<span id=\"Create_VALIDATECC_Stored_Function\"><h3>Create VALIDATECC Stored Function<\/h3><\/span>\n<p>* Login Oracle database as soademo<br \/>\n* Run the following script:<\/p>\n<pre lang=\"sql\">\r\ncreate or replace FUNCTION VALIDATECC(cc_number IN VARCHAR2) \r\nRETURN VARCHAR2 AS\r\n    l_status  CREDITCARDINFO.STATUS%TYPE;\r\nBEGIN\r\n     select status\r\n     into  l_status\r\n     from   creditcardinfo\r\n     where  ccnumber = cc_number;\r\n     RETURN l_status;\r\nEXCEPTION\r\n      WHEN NO_DATA_FOUND THEN\r\n          raise_application_error(-20001, 'UNKNOWN CREDIT CARD');\r\nEND VALIDATECC;\r\n\/\r\n<\/pre>\n<span id=\"Create_a_New_DB_Adapter:_validateCC\"><h3>Create a New DB Adapter: validateCC<\/h3><\/span>\n<p>* Open ValidationForCC application<br \/>\n* Open composite.xml<br \/>\n* Drag and drop a Database Adapter onto External References lane.<br \/>\n* Configure db adapter with following values:<br \/>\n&#8211; Service Name: validateCC<br \/>\n&#8211; Connection: soademoDatabase<br \/>\n&#8211; Schema: select SOADEMO<br \/>\n&#8211; JNDI Name: eis\/DB\/soademoDatabase<br \/>\n&#8211; Operation Type: Call a Stored Procedure or Function<br \/>\n&#8211; Procedure: Browse and select VALIDATECC<\/p>\n<span id=\"Wire_up_RouteRequest_to_validateCC_Database_Adapter\"><h3>Wire up RouteRequest to validateCC Database Adapter<\/h3><\/span>\n<p>* Wire RouteRequest mediator component to validateCC database adapter.<br \/>\n* Open RouteRequest mediator by double clicking it.<br \/>\n* Add a filter for getCreditValidation::getCreditValidationSelect to route all requests whose credit card numbers <strong>don&#8217;t<\/strong> start with 2.<\/p>\n<pre>\r\nnot(starts-with($in.creditcardStatusRequestPart\/inp1:creditcardStatusRequest\/inp1:CCNumber, '2'))\r\n<\/pre>\n<p>* Add a filter for validateCC::validateCC to route all requests whose credit card numbers <strong>do<\/strong> start with 2.<\/p>\n<pre>\r\nstarts-with($in.creditcardStatusRequestPart\/inp1:creditcardStatusRequest\/inp1:CCNumber, '2')\r\n<\/pre>\n<p>* Create a new transformation for validateCC route. Map inp1:CCNumber to db:CC_NUMBER<br \/>\n*Save all<\/p>\n<span id=\"Test\"><h3>Test<\/h3><\/span>\n<p>* Redeploy validationForCC application.<br \/>\n* Test with credit card number  1234-1234-1234-1234. Should return VALID status.<br \/>\n* Test with credit card number  2234-1234-1234-1234. Should get UNKNOWN CREDIT CARD exception.<\/p>\n<pre>\r\n...\r\nCause: java.sql.SQLException: ORA-20001: UNKNOWN CREDIT CARD\r\n...\r\n<\/pre>\n<span id=\"Handle_Application_Error_in_BPEL\"><h3>Handle Application Error in BPEL<\/h3><\/span>\n<span id=\"Add_a_Scope_Fault_Catcher\"><h4>Add a Scope Fault Catcher<\/h4><\/span>\n<p>* Open POProcessing composite.xml file.<br \/>\n* Open approvelargeOrder BPEL process by double clicking it.<br \/>\n* Add a new scope activity under assignCCNumber and above invokeCCStatusService. Rename it to checkCC (double clicking it to set value).<br \/>\n* Move invokeCCStatusService into the scope.<br \/>\n* On the new scope&#8217;s left side vertical bar, click the Add Catch icon (third one from top) to add a Catch branch.<br \/>\n* Double click Catch icon to bring up the Catch dialog.<br \/>\n&#8211; Click the magnifying glass inside Fault Name panel, browse to System Faults -> BindingFault.<br \/>\n~ Namespace URI: http:\/\/schemas.oracle.com\/bpel\/extension<br \/>\n~ Local Part: bindingFault<br \/>\n&#8211; Click green plus sign to the right of Fault Variable to bring up the Create Variable dialog. Accept all default name.<br \/>\n~ Fault Variable: FaultVar<br \/>\n&#8211; Click OK<br \/>\n* Drop a Switch activity inside the catch block.<br \/>\n* Click new switch activity&#8217;s condition block and enter<br \/>\n&#8211; Label: InvalidCreditCard<br \/>\n&#8211; Condition: bpws:getVariableData(&#8216;FaultVar&#8217;)  = &#8216;20001&#8217;<br \/>\n* Add an Assign activity inside InvalidCreditCard branch. Name it AssignUnknownCC.<br \/>\n* Assign &#8216;UNKNOWN CC&#8217; string to  invokeCCStatusService_execute_OutputVariable -> creditCardStatusPart -> creditcardStatus.<br \/>\n* Drag and drop a Throw activity in the otherwise block. Name it Throw_Binding_Fault.<br \/>\n* Double click Throw icon to bring up the Throw dialog.<br \/>\n&#8211; Click the magnifying glass inside Fault QName panel, browse to System Faults -> BindingFault.<br \/>\n~ Namespace URI: http:\/\/schemas.oracle.com\/bpel\/extension<br \/>\n~ Local Part: bindingFault<br \/>\n&#8211; Click magnifying glass sign to the right of Fault Variable and select previously created FaultVar variable.<br \/>\n~ Fault Variable: FaultVar<br \/>\n&#8211; Click OK<br \/>\n* Save all<\/p>\n<span id=\"Configure_fault-policies.xml_to_Catch_Fault_Code\"><h4>Configure fault-policies.xml to Catch Fault Code<\/h4><\/span>\n<p>* Open fault-policies.xml and add to conditions block:<\/p>\n<pre lang=\"xml\">\r\n      <faultName xmlns:bpelx=\"http:\/\/schemas.oracle.com\/bpel\/extension\" \r\n                 name=\"bpelx:bindingFault\"> \r\n          <condition> \r\n                  <!-- Let the component handle this specific binding fault --> \r\n                  <test>$fault.code=\"20001\"<\/test> \r\n                  <action ref=\"ora-rethrow-fault\"\/> \r\n          <\/condition> \r\n      <\/faultName>\r\n<\/pre>\n<span id=\"Test_BPEL_Fault_Catcher\"><h4>Test BPEL Fault Catcher<\/h4><\/span>\n<p>* Redeploy POProcessing application.<br \/>\n* Input message (note that credit card number stats with 2):<\/p>\n<pre lang=\"xml\">\r\n<soap:Envelope xmlns:soap=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\">\r\n    <soap:Body xmlns:ns1=\"http:\/\/xmlns.oracle.com\/ns\/order\">\r\n        <ns1:PurchaseOrder>\r\n            <ns1:CustID>1111<\/ns1:CustID>\r\n            <ns1:ID>2222<\/ns1:ID>\r\n            <ns1:productName>iPod shuffle<\/ns1:productName>\r\n            <ns1:itemType>Electronics<\/ns1:itemType>\r\n            <ns1:price>145<\/ns1:price>\r\n            <ns1:quantity>30<\/ns1:quantity>\r\n            <ns1:status>Initial<\/ns1:status>\r\n            <ns1:ccType>Mastercard<\/ns1:ccType>\r\n            <ns1:ccNumber>2234-1234-1234-1234<\/ns1:ccNumber>\r\n        <\/ns1:PurchaseOrder>\r\n    <\/soap:Body>\r\n<\/soap:Envelope>\r\n<\/pre>\n<p>* Click Launch Flow Trace button to see the message flow.<\/p>\n<pre>\r\nFaulted while invoking operation \"execute\" on provider \"getCreditCardStatus\". \r\n<\/pre>\n<span id=\"Errors\"><h2>Errors<\/h2><\/span>\n<span id=\"http:schemas.oracle.combpelextensionbindingFault_not_defined\"><h3>{http:\/\/schemas.oracle.com\/bpel\/extension}bindingFault not defined<\/h3><\/span>\n<p>* BPEL compiler error:<\/p>\n<pre>\r\nWSDL messageType \"{http:\/\/schemas.oracle.com\/bpel\/extension}bindingFault\" of variable \"CheckCCFaultVar\" is not defined in any of the WSDL files\r\n<\/pre>\n<p>* Possible cause:<br \/>\nFault variable CheckCCFaultVar was auto-generated from Catch diaglog.<br \/>\n* Fix:<br \/>\nRedefine CheckCCFaultVar variable:<br \/>\n&#8211; Locate CheckCCFaultVar variable.<br \/>\n&#8211; Double click it to open the Edit Variable dialog.<br \/>\n&#8211; Click magnifying glass icon to the right of Message Type field.<br \/>\n&#8211; Click Import WSDL File&#8230; icon on the upper right corner of Type Choose dialog.<br \/>\n&#8211; Click the magnifying glass search icon on the import WSDL file dialog.<br \/>\n&#8211; Browse to RuntimeFault.wsdl file in the C:\\Oracle\\Middleware\\jdeveloper\\integration\\seed\\soa\\shared\\bpel directory.<br \/>\n&#8211; Click OK<br \/>\n&#8211; Check Copy to Project and click OK on import WSDL file dialog.<br \/>\n&#8211; Click OK on Localize Files dialog.<\/p>\n<span id=\"Custom_Java_Fault_Handler\"><h2>Custom Java Fault Handler<\/h2><\/span>\n<span id=\"Create_Custom_Java_Fault_Handler\"><h3>Create Custom Java Fault Handler<\/h3><\/span>\n<pre lang=\"java\">\r\npublic class MyFaultHandler implements IFaultRecoveryJavaClass {\r\n    public MyFaultHandler() {\r\n        super();\r\n    }\r\n\r\n    public void handleRetrySuccess(IFaultRecoveryContext ifc) {\r\n        ...\r\n    }\r\n\r\n    public String handleFault(IFaultRecoveryContext ifc) {\r\n        ...\r\n    }\r\n\r\n<\/pre>\n<span id=\"Install_Custom_Java_Fault_Handler\"><h3>Install Custom Java Fault Handler<\/h3><\/span>\n<p>* Copy myfalthandler.jar to soa domain lib direcotry: \/opt\/oracle\/Middleware\/home_11gr1\/user_projects\/domains\/soa_domain\/lib<br \/>\n* Restart soa server<\/p>\n<span id=\"Use_Custom_Java_Handler\"><h3>Use Custom Java Handler<\/h3><\/span>\n<p>* Modify fault-policies.xml<br \/>\n&#8211; Add condition to use custom handler<\/p>\n<pre lang=\"xml\">\r\n    <Conditions>\r\n    <faultName xmlns:bpelx=\"http:\/\/schemas.oracle.com\/bpel\/extension\"  \r\n        name=\"bpelx:remoteFault\">     \r\n        <condition>\r\n            <action ref=\"my-java-handler\"\/>\r\n       <\/condition>\r\n    <\/faultName>\r\n...\r\n<\/pre>\n<p>&#8211; Define custom action:<\/p>\n<pre lang=\"xml\">\r\n    <Actions>\r\n      <!-- Custom Java Handler: Logs the fault details to a log file -->\r\n      <Action id=\"my-java-handler\">\r\n        <javaAction className=\"soatraining.faulthandling.MyFaultHandler\"\r\n                    defaultAction=\"ora-terminate\" propertySet=\"myProps\">\r\n          <returnValue value=\"OK\" ref=\"ora-rethrow-fault\"\/>\r\n        <\/javaAction>\r\n      <\/Action>\r\n...\r\n<\/pre>\n<p>&#8211; Set custom handler properties:<\/p>\n<pre lang=\"xml\">\r\n    <Properties>\r\n      <!-- Property set for MyFaultHandler customer java action -->\r\n      <propertySet name=\"myProps\">\r\n        <property name=\"logFileName\">myfaulthandler.log<\/property>\r\n        <property name=\"logFileDir\">\/tmp\/po\/log<\/property>\r\n      <\/propertySet>\r\n...\r\n<\/pre>\n<span id=\"Test_1\"><h3>Test<\/h3><\/span>\n<p>* Redeploy<br \/>\n* Test with input message<\/p>\n<pre lang=\"xml\">\r\n<soap:Envelope xmlns:soap=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\">\r\n    <soap:Body xmlns:ns1=\"http:\/\/xmlns.oracle.com\/ns\/order\">\r\n        <ns1:PurchaseOrder>\r\n            <ns1:CustID>1111<\/ns1:CustID>\r\n            <ns1:ID>2222<\/ns1:ID>\r\n            <ns1:productName>iPod shuffle<\/ns1:productName>\r\n            <ns1:itemType>Electronics<\/ns1:itemType>\r\n            <ns1:price>145<\/ns1:price>\r\n            <ns1:quantity>30<\/ns1:quantity>\r\n            <ns1:status>Initial<\/ns1:status>\r\n            <ns1:ccType>Mastercard<\/ns1:ccType>\r\n            <ns1:ccNumber>2234-1234-1234-1234<\/ns1:ccNumber>\r\n        <\/ns1:PurchaseOrder>\r\n    <\/soap:Body>\r\n<\/soap:Envelope>\r\n<\/pre>\n<p>* Check log file at \/tmp\/po\/log\/myfaulthandler.log<\/p>\n<span id=\"Handle_Mediator_Faults\"><h2>Handle Mediator Faults<\/h2><\/span>\n<p>* Policy based fault handler is the only way to catch and handle mediator exceptions.<\/p>\n<span id=\"Configure_Fault_Policy_for_Mediator\"><h3>Configure Fault Policy for Mediator<\/h3><\/span>\n<p>* Add to fault-policies.xml<br \/>\n&#8211; Add condition to use custom handler<\/p>\n<pre lang=\"xml\">\r\n    <Conditions>\r\n      <faultName xmlns:medns=\"http:\/\/schemas.oracle.com\/mediator\/faults\" \r\n                 name=\"medns:mediatorFault\">\r\n        <condition>\r\n          <action ref=\"my-mediator-fault-handler\"\/>\r\n        <\/condition>\r\n      <\/faultName>\r\n...\r\n<\/pre>\n<p>&#8211; Define mediator fault action:<\/p>\n<pre lang=\"xml\">\r\n    <Actions>\r\n      <Action id=\"my-mediator-fault-handler\">\r\n        <javaAction className=\"soatraining.faulthandling.MyFaultHandler\" \r\n                    defaultAction=\"ora-terminate\" \r\n                    propertySet=\"myMediatorProps\">\r\n          <returnValue value=\"OK\" ref=\"ora-human-intervention\">\r\n          <\/returnValue>\r\n        <\/javaAction>\r\n      <\/Action>\r\n...\r\n<\/pre>\n<p>&#8211; Set mediator handler properties:<\/p>\n<pre lang=\"xml\">\r\n    <Properties>\r\n      <propertySet name=\"myMediatorProps\">\r\n      <propertySet name=\"myMediatorProps\">\r\n         <property name=\"logFileName\">mediator- faults. log<\/property>\r\n        <property name=\"logFileDir\">\/tmp\/po\/log<\/property>\r\n      <\/propertySet>\r\n...\r\n<\/pre>\n<span id=\"Configure_Mediator_Component\"><h3>Configure Mediator Component<\/h3><\/span>\n<p>* Open routePO mediator component (routePO.mplan)<br \/>\n* Change price * quantity < 1000 route from sequential to parallel. This is needed in order for fault policy handler to intercept the exception.\n\n\n\n<span id=\"Test_2\"><h3>Test<\/h3><\/span>\n<p>* Redeploy POProcessing<br \/>\n* make log directory un-writable: chmod -w \/tmp\/po<br \/>\n* Test with input message that has price * quantity < 1000\n\n\n<pre lang=\"xml\">\r\n<soap:Envelope xmlns:soap=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\">\r\n    <soap:Body xmlns:ns1=\"http:\/\/xmlns.oracle.com\/ns\/order\">\r\n        <ns1:PurchaseOrder>\r\n            <ns1:CustID>1111<\/ns1:CustID>\r\n            <ns1:ID>2222<\/ns1:ID>\r\n            <ns1:productName>iPod shuffle<\/ns1:productName>\r\n            <ns1:itemType>Electronics<\/ns1:itemType>\r\n            <ns1:price>145<\/ns1:price>\r\n            <ns1:quantity>30<\/ns1:quantity>\r\n            <ns1:status>Initial<\/ns1:status>\r\n            <ns1:ccType>Mastercard<\/ns1:ccType>\r\n            <ns1:ccNumber>1234-1234-1234-1234<\/ns1:ccNumber>\r\n        <\/ns1:PurchaseOrder>\r\n    <\/soap:Body>\r\n<\/soap:Envelope>\r\n<\/pre>\n<p>* Check log file at \/tmp\/po\/log\/mediator- faults. log<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is part of the Oracle SOA11g hands on tutorials. Overview * See this post Fault Types System Faults * Examples &#8211; Service not available &#8211; Network failure Business Faults * Examples &#8211; Invalid data &#8211; Violation of business rules &hellip; <a href=\"https:\/\/jianmingli.com\/wp\/?p=2708\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[100],"tags":[],"class_list":["post-2708","post","type-post","status-publish","format-standard","hentry","category-soa11g"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8cRUO-HG","_links":{"self":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/2708","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2708"}],"version-history":[{"count":12,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/2708\/revisions"}],"predecessor-version":[{"id":10657,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/2708\/revisions\/10657"}],"wp:attachment":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2708"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2708"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2708"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}