您是否嘗試過創建錯誤序列或錯誤處理程序?
您可以添加一個故障序列的代理服務:
<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);
/* */ }
/* */ }
它允許使用甚至嵌套的錯誤處理,這是不工作的開箱的,據我所知。
是的,我有一個故障序列(嘗試兩種變體),但在這種情況下,它沒有運行。代理返回空白結果(<原始響應數據丟失>) – awc
已更新anwser與我的錯誤處理修復程序 – user3714601