如何从Mirth中的Web服务响应中提取BACK?

时间:2012-07-05 07:40:41

标签: mirth

我有一个目的地,它将一个HL7 v2消息发送到WCF Web服务。我已经设法将消息正确地发送到Web服务(在修复各种编码问题之后),我可以确认消息正确到达WCF端点。但是,在论坛和文档中大量搜索后,我无法正确解析收到的ACK,以指示何时发生错误。

来自网络服务的回复如下:

<?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并将其作为目标的输出传递? Will Mirth会自动解析ACK并确定存在错误吗?

我以为我在目的地需要某种变形器(称为'SOAP')并使用以下内容:

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

然后提取ProcessMessageResponse元素,但responseMap.get('SOAP')返回null,这似乎是错误的方法。

1 个答案:

答案 0 :(得分:2)

我现在已经解决了部分问题,感谢answer on the Mirth forums

总结一下,我使用以下后处理器来提取确认并更新状态:

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));
}

不漂亮,但有效......