2012-07-05 6 views
1

У меня есть пункт назначения, который отправляет сообщение HL7 v2 в веб-службу WCF. Мне удалось корректно получить сообщение в webservice (после устранения различных проблем с кодировкой), и я могу подтвердить, что сообщение правильно доходит до конечной точки WCF. Однако после многократной охоты на форумах и документации я не могу правильно разобрать ACK, который мы получаем, чтобы указать, когда произошла ошибка.Как извлечь ACK из ответа веб-службы в Mirth?

Отклик возвращается из веб-сервиса выглядит следующим образом:

<?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> 

Ответ содержит ACK в элементе ProcessMessageResult. Как извлечь этот ACK из ответа и передать его в качестве результата назначения? Will 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)); 
} 

не очень, но это работает ...