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;
}
有人可以确认此修复程序吗?
答案 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。希望这能解决问题。
干杯, 长香。