WSO2 ESB HL7传输确认问题

时间:2013-02-23 02:55:44

标签: axis2 wso2 wso2esb

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

我面临的问题是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;
}

有人可以确认此修复程序吗?

2 个答案:

答案 0 :(得分:1)

从版本ESB 4.7.0开始,您可以依次使用hl7中的HL7_APPLICATION_ACK属性来等待后端应用程序的响应。

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

hl7代理中的参数AutoAck为false

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

答案 1 :(得分:0)

现有代码实际上是正确的,如果你仔细看看JIRA问题,它已经提到了应该如何使用该功能。所以基本上,用户自己不必创建ACK HL7消息的XML表示,当他设置名为“HL7_RESULT_MODE”的Axis2范围消息属性时,这会自动完成,无论是对ACK还是NACK。因此,基本上通过该功能,下游应用程序/序列可以通过适当地设置消息属性值来选择ACK或NACK。希望这能解决问题。

干杯, 长香。