2013-02-23 39 views
1

WSO2 ESB提供了HL7傳輸,這是很好的選擇。傳輸在多種模式下工作1)默認模式:自動確認2)NACK模式:無確認3)ACK模式:來自下游序列或另一個HL7端點的自定義確認。這些模式記錄在http://docs.wso2.org/wiki/display/ESB451/HL7+Transport。 JIRA追蹤器還確認了關於模式配置的相同信息。 https://wso2.org/jira/browse/ESBJAVA-954WSO2 ESB HL7傳輸確認問題

我面臨的問題是允許從下游應用程序或序列中進行確認的ACK模式返回到已啓動對WSO2 ESB的調用的應用程序。我可以在日誌中清楚地看到下游應用程序或序列正在返回確認,並且正在被HL7傳輸API分析。但是,等待來自WSO2 ESB的響應的應用程序始終僅獲取默認確認。

查看HL7傳輸代碼時,看起來WSO2代碼有缺陷,並且從下游序列中不會返回確認。下面是從HL7ProcessingContext.java

public Message handleHL7Result(MessageContext ctx, Message hl7Msg) throws HL7Exception  
{ 
    String resultMode = (String) ctx.getProperty(HL7Constants.HL7_RESULT_MODE); 
    if (resultMode != null) { 
     if (HL7Constants.HL7_RESULT_MODE_ACK.equals(resultMode)) { 
      return this.createAck(hl7Msg); 
     } else if (HL7Constants.HL7_RESULT_MODE_NACK.equals(resultMode)) { 
      String nackMessage = (String) ctx.getProperty(HL7Constants.HL7_NACK_MESSAGE); 
      if (nackMessage == null) { 
       nackMessage = ""; 
      } 
      return this.createNack(hl7Msg, nackMessage); 
     } 
    } else if (this.isAutoAck()) { 
     return this.createAck(hl7Msg); 
    } 
    return this.createNack(hl7Msg, "Application Error: ACK/NACK was not explicitely returned"); 
} 

如果我沒有記錯的方法中,需要如下圖所示

***** Original Code from above**** 
if (HL7Constants.HL7_RESULT_MODE_ACK.equals(resultMode)) { 
      return this.createAck(hl7Msg); 
} 

***** Revised code ***** 
if (HL7Constants.HL7_RESULT_MODE_ACK.equals(resultMode)) { 
    OMElement omElement = msgCtx.getEnvelope().getBody().getFirstElement().getFirstElement(); 
    String xmlFormat = omElement.toString(); 
    Message message = this.xmlParser.parse(xmlFormat); 
    return message; 
} 

有人能證實此修復程序來改變這個代碼?

回答

0

現有的代碼實際上是正確的,如果你仔細看看JIRA問題,它已經提到應該如何使用該功能。所以基本上,用戶自己不必創建ACK HL7消息的XML表示,當他設置名爲「HL7_RESULT_MODE」的Axis2範圍消息屬性時,這會自動完成,以對ACK或NACK進行說。因此,基本上使用該功能,通過適當地設置消息屬性值,下游應用程序/序列可以選擇ACK或NACK。希望這可以解決問題。

乾杯, Anjana。

+1

我有transport.hl7.AutoAck =假和HL7_RESULT_MODE = ACK。所以我期待從下游應用程序返回給用戶。用戶仍然得到默認確認,而WSO2從下游應用接收到ack並通過日誌中介記錄下來,並且在控制檯上得到異常,表明下游ack不能返回給用戶,因爲我沒有在我的發送中介中指定EPR out序列。我如何解決這個問題?如果你可以給我一個代理服務xml例子,顯示下游HL7應用程序的真正的確認返回給用戶的直接代理那麼這將是很大的幫助 – user1431708 2013-02-23 19:13:52

+0

嗨..我想我只是瞭解你的需求..你想HL7確認從外部應用程序返回的消息以從代理服務返回..我們目前不支持..序列的責任是告知ESB如何創建合適的消息和響應,或者是ACK或NACK。因此,目前,您可以做的是檢查從下游應用程序返回的消息,以確定它是否爲ACK或NACK,並正確設置消息上下文以使ESB響應具有正確的消息。 – 2013-02-24 08:13:28

+0

另外,爲了正確地滿足您的需求,基本上支持只使用ESB傳遞HL7消息,需要更改的代碼是將「else」塊放到最外面的if/else語句中在該方法中,並放置您提到的類似類型的代碼。因此,基本上,最後一句聲明「應用程序錯誤,提到的ACK/NACK」將被刪除。你可以爲此創造一個問題作爲改進,所以我們可以檢查這一點,並妥善解決這個問題。 – 2013-02-24 08:17:16

1

從版本ESB 4.7.0開始,您可以依次使用hl7中的HL7_APPLICATION_ACK屬性來等待後端應用程序的響應。

<property description="HL7_APPLICATION_ACK" name="HL7_APPLICATION_ACK" scope="axis2" type="STRING" value="true"/> 

與參數AutoAck爲false在HL7代理

<parameter name="transport.hl7.AutoAck">false</parameter>