如何处理WSO2ESB中的错误序列

时间:2013-03-11 06:32:48

标签: wso2 wso2esb wso2dss

我希望使用故障序列处理错误但我希望使用删除操作自定义它 我的情况是,当我插入2个表时,如果第二个表插入错误,我需要删除第一行插入,我的配置在下面

<proxy xmlns="http://ws.apache.org/ns/synapse" name="ErrorHandling" transports="https,http" statistics="disable" trace="disable" startOnLoad="true">
   <target >
      <inSequence onError="fault">
         <property name="eno" expression="//eno/text()" scope="default" type="STRING"/>
         <property name="ename" expression="//ename/text()" scope="default" type="STRING"/>
         <property name="esal" expression="//esal/text()" scope="default" type="STRING"/>
         <property name="deptname" expression="//deptname/text()" scope="default" type="STRING"/>
         <property name="deptid" expression="//deptid/text()" scope="default" type="STRING"/>
         <payloadFactory>
            <format>
               <p:insert_emp_operation xmlns:p="http://ws.wso2.org/dataservice">
                  <xs:eno xmlns:xs="http://ws.wso2.org/dataservice">$1</xs:eno>
                  <xs:ename xmlns:xs="http://ws.wso2.org/dataservice">$2</xs:ename>
                  <xs:esal xmlns:xs="http://ws.wso2.org/dataservice">$3</xs:esal>
               </p:insert_emp_operation>
            </format>
            <args>
               <arg expression="get-property('eno')"/>
               <arg expression="get-property('ename')"/>
               <arg expression="get-property('esal')"/>
            </args>
         </payloadFactory>
         <send receive="Error_Seq">
            <endpoint>
               <address uri="http://localhost:9764/services/emp_DataService/" format="soap11"/>
            </endpoint>
         </send>
         <log level="full"/>
      </inSequence>
      <outSequence  onError="fault">
         <send/>
         <log level="full"/>
      </outSequence>
   </target>
   <description></description>
</proxy>

和序列就是这样

<sequence xmlns="http://ws.apache.org/ns/synapse" name="Error_Seq" onError="fault">
   <property xmlns:f="http://ws.wso2.org/dataservice" xmlns:ns="http://org.apache.synapse/xsd" name="ID" expression="//f:ID/text()" scope="default" type="STRING"/>
   <log>
      <property xmlns:ns="http://org.apache.synapse/xsd" name="faisal" expression="get-property('ID')"/>
   </log>
   <payloadFactory>
      <format>
         <p:insert_dept_operation xmlns:p="http://ws.wso2.org/dataservice">
            <xs:deptno xmlns:xs="http://ws.wso2.org/dataservice">$1</xs:deptno>
            <xs:deptname xmlns:xs="http://ws.wso2.org/dataservice">$2</xs:deptname>
            <xs:deptid xmlns:xs="http://ws.wso2.org/dataservice">$3</xs:deptid>
         </p:insert_dept_operation>
      </format>
      <args>
         <arg xmlns:ns="http://org.apache.synapse/xsd" expression="get-property('ID')"/>
         <arg xmlns:ns="http://org.apache.synapse/xsd" expression="get-property('deptname')"/>
         <arg xmlns:ns="http://org.apache.synapse/xsd" expression="get-property('deptid')"/>
      </args>
   </payloadFactory>
   <send>
      <endpoint>
         <address uri="http://localhost:9764/services/dept_DataService/" format="soap11"/>
      </endpoint>
   </send>
</sequence>

故障序列就像这样

<sequence xmlns="http://ws.apache.org/ns/synapse" name="fault">
   <property xmlns:ns="http://org.apache.synapse/xsd" name="ID" expression="get-property('ID')" scope="default" type="STRING"/>
   <log level="full">
      <property name="MESSAGE" value="Executing default 'fault' sequence"/>
      <property xmlns:ns="http://org.apache.synapse/xsd" name="ERROR_CODE" expression="get-property('ERROR_CODE')"/>
      <property xmlns:ns="http://org.apache.synapse/xsd" name="ERROR_MESSAGE" expression="get-property('ERROR_MESSAGE')"/>
      <property xmlns:ns="http://org.apache.synapse/xsd" name="Property" expression="get-property('ID')"/>
   </log>
   <payloadFactory>
      <format>
         <p:Delete_Op xmlns:p="http://ws.wso2.org/dataservice">
            <xs:eno xmlns:xs="http://ws.wso2.org/dataservice">$1</xs:eno>
         </p:Delete_Op>
      </format>
   </payloadFactory>
   <send>
      <endpoint>
         <address uri="http://localhost:9764/services/dept_DataService/" format="soap11"/>
      </endpoint>
   </send>
</sequence>

但是当DSS处于OFF模式时它无法正常工作让我知道DSS处于运行模式时如何删除第一个表行

1 个答案:

答案 0 :(得分:0)

在DSS中更新失败的情况下,它会将SOAP错误发送回ESB。 由于ESB这仍然只是另一个消息响应,并且它不会转到故障序列,除非您明确检查消息并执行必要的操作。 所以你必须声明comming消息是一个SOAP_FAULT,所以你要说它是一个SOAP_FAULT并强迫它出错。这在[1]中有解释。

[1] http://maharachchi.blogspot.com/2012/09/now-you-can-send-soapfaults-to-fault.html