我有一个目的地,它将一个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|^~\&|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,这似乎是错误的方法。
答案 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));
}
不漂亮,但有效......