2017-07-25 102 views
0

我有呼叫調解員與VFS裏面創建文件。當保存失敗時(沒有權限),我沒有收到超時錯誤或其他東西來理解這一點。這是從順序的一部分: <property description="Concat path" expression="fn:concat('vfs:file:///',get-property('BPath'),'/',get-property('dynamic'),'/wso2.file')" name="Path" scope="default" type="STRING"/> <header expression="get-property('Path')" name="To" scope="default"/> <property description="OUT_ONLY=true" name="OUT_ONLY" scope="default" type="STRING" value="true"/> <call description=""> <endpoint> <default/> </endpoint> </call>呼叫中介沒有錯誤超時

問題是:如何保存失敗時從調解員獲取錯誤消息?

在此先感謝!

回答

0

您是否嘗試過創建錯誤序列或錯誤處理程序?

您可以添加一個故障序列的代理服務:

<faultSequence> 
     <sequence key="conf:sequences/common/ErrorHandlerSeq.xml"/> 
</faultSequence> 

或者定義錯誤處理程序的順序:

<sequence name="mySequence" onError="conf:sequences/common/ErrorHandlerSeq.xml"> 
... 
</sequence> 

然而,錯誤WSO2處理的情況比較特殊,您的調解器可能需要將異常包裝到SynapseException中,以使其觸發錯誤處理程序。

UPDATE

繼評論,它看起來是一個衆所周知的問題,在WSO2處理錯誤。罪魁禍首是ProxyServiceMessageReceiver.class從突觸核心,具有以下行:

/*  */  catch (SynapseException syne) 
/*  */  { 
/* 193 */  if (!synCtx.getFaultStack().isEmpty()) { 
/* 194 */   warn(traceOn, "Executing fault handler due to exception encountered", synCtx); 
/* 195 */   ((FaultHandler)synCtx.getFaultStack().pop()).handleFault(synCtx, syne); 
/*  */  } 
/*  */  else { 
/* 198 */   warn(traceOn, "Exception encountered but no fault handler found - message dropped", synCtx); 
/*  */  } 
/*  */  } 
/*  */  finally { 
/* 202 */  StatisticsReporter.endReportForAllOnRequestProcessed(synCtx); 
/*  */  } 

明顯的問題這裏只觸發時SynapseException被捕獲的錯誤處理,其他人都被忽略。

如果您可以更新WSO2實例的類,則可以使其捕獲所有異常。

我改變了這段代碼有以下幾點:

/*  */  catch (Exception syne) 
/*  */  { 
/* 193 */  log.error("Exception caught on mediation sequence", syne); 
      if (!synCtx.getFaultStack().isEmpty()) { 
/* 194 */   warn(traceOn, "Executing fault handler due to exception encountered", synCtx); 
       try { 
/* 195 */   ((FaultHandler)synCtx.getFaultStack().pop()).handleFault(synCtx, syne); 
       } catch (Exception ex) { 
        log.error("Exception caught while executing fault handler", ex); 
        //warn(traceOn, "Exception caught while executing fault handler", synCtx); 
        if (!synCtx.getFaultStack().isEmpty()) { 
         warn(traceOn, "Executing nested fault handler", synCtx); 
         try { 
          ((FaultHandler)synCtx.getFaultStack().pop()).handleFault(synCtx, ex); 
         } catch (Exception e) { 
          log.error("Exception caught while executing nested fault handler, mediation stopped", e); 
         } 
        } else { 
         warn(traceOn, "No nested fault handler found - message dropped", synCtx); 
        } 
       } 
/*  */  } 
/*  */  else { 
/* 198 */   warn(traceOn, "Exception encountered but no fault handler found - message dropped", synCtx); 
/*  */  } 
/*  */  } 

它允許使用甚至嵌套的錯誤處理,這是不工作的開箱的,據我所知。

+0

是的,我有一個故障序列(嘗試兩種變體),但在這種情況下,它沒有運行。代理返回空白結果(<原始響應數據丟失>) – awc

+0

已更新anwser與我的錯誤處理修復程序 – user3714601