2012-04-18 57 views
1

使用版本4.0.3,我目前有一個IN和OUT序列參與一個JMS-to-HTTP代理,它定義了一個錯誤處理程序,如果有異常,它將成功回滾JMS本地事務,但是錯誤不是在響應中返回一個SOAPFault(僅來自ClientHandler的WARN消息)的情況下拋出,因此我失去了原始的JMS消息(它已提交)。我應該注意的是,如果我解析OUT序列中的響應並在那裏發現故障,執行回滾將不起作用,因爲到達OUT序列時,JMS事務將被提交。WSO2 ESB:如何在響應中的SOAP錯誤時執行JMS回滾?

我發現下面的「解決固定」吉拉票WSO2 ESB的下一個版本,其可能似乎解決我的問題,但沒有等待這個版本得到這個工作的奢侈品: https://wso2.org/jira/browse/ESBJAVA-906

我的問題是,是否有任何解決方法可用,我可以在4.0.3中實現?有沒有辦法阻止線程執行提交,直到我可以確定結果等?如果沒有,您是否可以引用新版本的源代碼,以便我可以根據Jira故障單中實施的修復程序將自己的必要故障提供給突觸ClientHandler(或類似程序)?

這是我收到的警告(即我需要的是一個錯誤),還有一些額外的調試信息一起:

 
TID: [] [WSO2 ESB] [2012-04-18 17:18:23,786] INFO {org.apache.synapse.core.axis2.TimeoutHandler} - This engine will expire all callbacks after : 86400 seconds, irrespective of the timeout action, after the specified or optional timeout {org.apache.synapse.core.axis2.TimeoutHandler} 
TID: [] [WSO2 ESB] [2012-04-18 17:18:23,790] DEBUG {org.apache.synapse.core.axis2.SynapseCallbackReceiver} - Callback added. Total callbacks waiting for : 1 {org.apache.synapse.core.axis2.SynapseCallbackReceiver} 
TID: [] [WSO2 ESB] [2012-04-18 17:18:24,006] WARN {org.apache.synapse.transport.nhttp.ClientHandler} - Received an internal server error : Internal Server Error For : 127.0.0.1:8080 For Request : Axis2Request [Message ID : urn:uuid:6322ced4-801f-40fe-a3a7-bb4019b02cdb] [Status Completed : true] [Status SendingCompleted : true] {org.apache.synapse.transport.nhttp.ClientHandler} 
TID: [] [WSO2 ESB] [2012-04-18 17:18:24,015] DEBUG {org.apache.synapse.core.axis2.SynapseCallbackReceiver} - Callback removed for request message id : urn:uuid:6322ced4-801f-40fe-a3a7-bb4019b02cdb. Pending callbacks count : 0 {org.apache.synapse.core.axis2.SynapseCallbackReceiver} 
TID: [] [WSO2 ESB] [2012-04-18 17:18:24,016] DEBUG {org.apache.synapse.core.axis2.SynapseCallbackReceiver} - Synapse received an asynchronous response message {org.apache.synapse.core.axis2.SynapseCallbackReceiver} 
TID: [] [WSO2 ESB] [2012-04-18 17:18:24,016] DEBUG {org.apache.synapse.core.axis2.SynapseCallbackReceiver} - Received To: null {org.apache.synapse.core.axis2.SynapseCallbackReceiver} 
TID: [] [WSO2 ESB] [2012-04-18 17:18:24,017] DEBUG {org.apache.synapse.core.axis2.SynapseCallbackReceiver} - SOAPAction: {org.apache.synapse.core.axis2.SynapseCallbackReceiver} 
TID: [] [WSO2 ESB] [2012-04-18 17:18:24,017] DEBUG {org.apache.synapse.core.axis2.SynapseCallbackReceiver} - WSA-Action: {org.apache.synapse.core.axis2.SynapseCallbackReceiver} 
TID: [] [WSO2 ESB] [2012-04-18 17:18:24,021] DEBUG {org.apache.synapse.core.axis2.SynapseCallbackReceiver} - Body : 
<?xml version='1.0' encoding='utf-8'?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <soap:Fault> 
     <faultcode>soap:Server</faultcode>  
     <faultstring>org.apache.cxf.service.factory.ServiceConstructionException: Failed to create service.</faultstring> 
    </soap:Fault> 
    </soap:Body> 
</soap:Envelope> 

{org.apache.synapse.core.axis2.SynapseCallbackReceiver }

回答

0

我能解決,雖然不是我所希望的;試圖避免修改對突觸行爲:

改變org.apache.synapse.transport.nhttp.ClientHandler讓我扔的故障對於這種類型的條件(SOAP故障)的,其執行標記之前執行回滾故障序列請求已完成。 (我也希望我能捕獲傳輸異常,比如連接失敗以類似的方式執行回滾,因爲這是Synapse允許事務處理消息傳遞的另一個令人驚訝的漏洞)。我開始懷疑是否有人真的在企業中使用這種類型的JMS-to-HTTP模式,因爲在實施時,有很大的消息泄漏機會,例如,如果端點關閉或拋出一個SOAP錯誤。我已經看過備用的「存儲和轉發」模式,但這是異步的,並且要求消息存儲隊列在發生故障或失敗的情況下在分佈式ESB中可恢復和可用 - 這與我的主消息隊列系統已經有了。出於這個原因,我覺得事務性的JMS是一條路。我錯過了什麼嗎?有沒有更好的模式,我應該考慮與Synapse/WSO2(理解我需要做同步的JMS到HTTP/SOAP代理接近零消息丟失)?