2012-07-05 88 views
1

我有一個目的地發送一個WCF web服務的HL7 v2消息。我已經設法正確地將消息傳遞給web服務(解決了各種編碼問題之後),並且我可以確認消息是否正確地到達WCF端點。然而,經過在論壇和文檔中大量討論後,我無法正確解析我們收到的ACK,以指示何時發生了錯誤。如何從Mser中的web服務響應中提取ACK?

從web服務回來的響應看起來像:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header/> 
    <s:Body> 
     <ProcessMessageResponse xmlns="http://www.bluewire-technologies.com/webservices"> 
      <ProcessMessageResult> 
       MSH|^~\&amp;|Epro|RGR|||||ACK||D||||||GBR|ASCII| 
       MSA|AE||Empty message| 
       ERR|^^^100| 
      </ProcessMessageResult> 
     </ProcessMessageResponse> 
    </s:Body> 
</s:Envelope> 

該響應包含在ProcessMessageResult元件的ACK。如何從響應中提取此ACK並將其作爲目標的輸出傳遞?請問Mirth會自動解析ACK並確定有錯誤?

我原以爲我需要某種形式的變壓器上的目標(稱爲「SOAP」)和使用的東西線沿線的:

var xml = responseMap.get('SOAP').getMessage(); 

然後提取ProcessMessageResponse元素,但responseMap.get(」 SOAP')返回null,這似乎是錯誤的方法。

回答

2

我現在已經解決了部分問題,這要歸功於answer on the Mirth forums

總之,我使用下面的後處理提取ACK和更新狀態:

var s = new Namespace('http://schemas.xmlsoap.org/soap/envelope/'); 
var bw = new Namespace('http://www.bluewire-technologies.com/webservices'); 

var response = new XML($r('SOAP').getMessage()); 
var ack = new XML(SerializerFactory.getHL7Serializer().toXML(response.s::Body.bw::ProcessMessageResponse.bw::ProcessMessageResult.toString())); 

var ackCode = ack.MSA['MSA.1']['MSA.1.1'].toString(); 
if(ackCode == 'AE') 
{ 
    var errorMessage = ack.MSA['MSA.3']['MSA.3.1'].toString(); 
    var messageController = com.mirth.connect.server.controllers.DefaultMessageObjectController.create(); 
    var channelStatisticsController = com.mirth.connect.server.controllers.DefaultChannelStatisticsController.create(); 

    messageObject.getContext().put("replace", "true"); // yuk - this is to make setError below work. 
    messageController.setError(messageObject, null, errorMessage, null, null); 
    channelStatisticsController.decrementSentCount(new java.lang.String(channelId)); 
} 

不漂亮,但它的作品...

相關問題