【问题标题】:WSO2 ESB HL7 Transport Acknowledgement issueWSO2 ESB HL7 传输确认问题
【发布时间】:2013-02-23 02:55:43
【问题描述】:

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;
}

有人可以确认这个修复吗?

【问题讨论】:

    标签: axis2 wso2 wso2esb


    【解决方案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

    &lt;parameter name="transport.hl7.AutoAck"&gt;false&lt;/parameter&gt;

    【讨论】:

      【解决方案2】:

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

      干杯, 安佳娜。

      【讨论】:

      • 我有 transport.hl7.AutoAck=false 和 HL7_RESULT_MODE=ACK。所以我期待来自下游应用程序的 ack 返回给用户。用户仍然获得默认确认,而 WSO2 从下游应用程序接收确认并通过日志调解器记录它,我在控制台上收到异常,指示下游确认无法返回给用户,因为我没有在我的发送调解器中指定 EPR出序列。我该如何解决这个问题?如果您能给我一个代理服务 xml 示例,该示例显示下游 HL7 应用程序的直接代理,并且将真正的 ack 返回给用户,那么这将是很大的帮助
      • 嗨..我想我刚刚理解了您的要求..您希望从外部应用程序返回的 HL7 ACK 消息从代理服务返回..我们目前不支持..序列的责任是向 ESB 发出信号,告知如何创建合适的消息和响应,无论是 ACK 还是 NACK。因此,目前,您可以做的是,检查从下游应用程序返回的消息,看看它是 ACK 还是 NACK,并适当地设置消息上下文以让 ESB 以正确的消息响应。
      • 另外,为了正确满足您的要求,基本上就是支持使用ESB传递HL7消息,需要更改的代码是,将“else”块放在最外面方法中的 if/else 语句,并放置您提到的类似类型的代码。因此,基本上最后一条语句“应用程序错误,要提到的 ACK/NACK”将被删除。您能否为此创建一个问题作为改进,以便我们检查并正确解决此问题。
      • 发布缺陷需要登录,而我没有 WSO2 JIRA。我怎么得到它?此外,我们喜欢为 HL7 传输创建一个补丁并向 ESB 客户端返回真正的确认。我们如何告诉 Axis.receive() 它应该使用 HL7 EPR 来返回响应?或者可能是我们如何告诉 Axis.receive() 我们喜欢它来调用特定的回调处理程序。您能否指出可以引导我们完成这项任务的方向或示例?
      • 您好,要创建 JIRA,您需要在 wso2.org 中拥有一个帐户,您可以直接去那里注册为用户。请这样做,并在那里解释您的问题,正如我之前所说,您现在仍然可以满足您的要求,方法是手动干预来自 ESB 序列的 HL7 调用的结果并设置适当的属性以发送确认/确认。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多