1

HL7v2メッセージをWCFWebサービスに送信する宛先があります。(さまざまなエンコードの問題を修正した後)Webサービスにメッセージを正しく送信でき、メッセージがWCFエンドポイントに正しく到達していることを確認できます。ただし、フォーラムやドキュメントを何度も探し回った後、受け取った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を返すため、これは間違ったアプローチのようです。

4

1 に答える 1

2

Mirthフォーラムでの回答のおかげで、この一部を解決しました。

要約すると、次のポストプロセッサを使用して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));
}

きれいではありませんが、動作します...

于 2012-07-05T16:03:09.267 に答える