“Healthcare:从 HL7 到 HL7”模式使用 GenericHL7Input 节点完整读取入局 HL7 消息;对可以包括在消息中的段没有任何限制,前提是这些段在此模式所使用的 HL7v25P 消息集中存在。此模式使用 IBM Integration Bus Healthcare Pack 随附的 HL7v25P 消息集。HL7v25P 消息集包含 HL7 V2.5 中所有有效标准段的定义。您可以向此 HL7v25P 消息集添加其他 Z 段。应用程序可以使用 Z 段来发送或接收已定义但不符合 HL7 规范的数据。
“接收方”流对源消息执行一次序列编号、重复检查和 HL7 应答。
此模式定义入局消息分发到的目标数。对于每个目标,将处理此消息并应用过滤。此过滤功能确定消息是否为目标所必需,以及源消息中要包括在输出消息中的段。
每个目标的“发送方”流确保消息按正确的顺序发送到目标应用程序。
输入消息最初由“接收方”流中的 GenericHL7Input 节点读作 BLOB 消息。在解析之前,将除去前导 MLLP 字节。如果找不到前导字节,那么将因为发送方未遵守 MLLP 协议而拒绝消息,关闭连接并发送否定应答 (NACK) 响应消息。
GenericHL7Input 节点根据 HL7v25P 消息集中的 HL7 消息定义对消息进行解析;请参阅“Healthcare:从 HL7 到 HL7”模式的资源。将读取所有段,如果任何段具有其他字段,那么这些字段将放在该段的“其余”字段中。
在“接收方”流中未进行标准的消息数据验证。但是,已确认 MSH 段中存在下列特定于 HL7 的数据字段,因为这些字段是继续处理所必需的:
每条 HL7 入局消息的 MSH 头段中都有一个 MessageControlID 字段,用于标识记录。
控制重复检查的模式参数用于在 GenericHL7Input 节点上设置等效属性。
如果在 IBM Integration Bus Toolkit 中选中了“检查重复”复选框,那么所有标识将与返回到发送方的应答 (ACK) 一起存储在重复队列中。将根据已保存的标识检查入局消息的标识,以确定其是否为重复项。
检测到重复项后,不会对此重复项进行处理,但随第一条消息发送的同一应答将返回到发送方。
标识将在重复队列中存储一段指定的时间,在该时间之后,这些标识将被删除,并且具有同一标识的消息不再被视作重复。消息标识的缺省存储时间段为 24 小时,但您可以使用模式参数更改此时间。必须对重复队列的大小进行调整,以使其包含所设置时间段内预期的消息标识数目的峰值。
如果入局消息不是重复项,那么此消息将通过 GenericHL7Input 节点的“输出”终端传递,以进行进一步处理。
如果检测到重复项,那么 GenericHL7Input 节点会将 ACK 返回给请求者。如果选择了重复报告并且检测到重复项,或者如果 GenericHL7Input 节点中发生了任何其他错误,那么消息将传递到“故障”终端,并且环境将提供有关此错误的描述。
“序号”参数确定“接收方”流如何向输入消息分配序号,以确保消息按正确的顺序进行交付。
下面三个选项可用于分配序号:
此模式的交互样式是源应用程序与集成节点流之间的同步交互,在发送同步应答之前,消息将保留在 TransformAndRoute 流的队列中。
缺省情况下,HL7 的“接收方”流将生成应答回复 (ACK) 或否定应答回复 (NACK) 消息作为对成功接收了数据的响应。如果不需要应答,请取消选中“发送应答”参数的复选框。
返回应答之后,消息流将确保对消息进行处理或者引发错误,在后一种情况下,将保存消息数据以允许进行再提交或其他处理。
在消息中存在构建应答所需的值时,将使用这些值。
端到端交互的当前状态存储在流中的所有主要点中,并且 NACK 消息包含此错误信息。
| 字段名 | 应答消息中的字段值 | 如果在输入消息中不存在 |
|---|---|---|
| MSH.1.FieldSeparator | 输入消息中的 MSH.1.FieldSeparator | '|' |
| MSH.ServiceString | 输入消息中的 MSH.2.ServiceString | “^~\&” |
| MSH.3.SendingApplication | “BROKER.RECEIVER” | |
| MSH.4.SendingFacility | ' ' | |
| MSH.5.ReceivingApplication | 输入消息中的 MSH.3.SendingApplication | ' ' |
| MSH.6.ReceivingFacility | 输入消息中的 MSH.4.SendingFacility | ' ' |
| MSH.7.DateTimeOfMessage | 这是采用“YYYYMMddHHmmss” 格式的当前日期时间。 | |
| MSH.9.MessageType | “ACK” | |
| MSH.10.MessageControlID | 新唯一标识 | |
| MSH.11.ProcessingID | 输入消息中的 MSH.11.ProcessingID | “P” |
| MSH.12.VersionID | 输入消息中的 MSH.12.VersionID | “2.2” |
| 字段名 | 应答消息中的字段值 | 如果在输入消息中不存在 |
|---|---|---|
| MSA.1.AcknowledgmentCode | 成功接收消息后,MSA 应答代码将设置为“AA”,并且 MSA.3.TextMessage 字段将为空。 | |
| MSA.2.MessageControlID | 输入消息中的 MSH.10.MessageControlID | “123456789” |
| MSA.3.TextMessage | 成功接收消息后,MSA 应答代码将设置为“AA”,并且 MSA.3.TextMessage 字段将为空。 | |
| MSA.4.ExpectedSequenceNumber | 输入消息中的 MSH.13.ExpectedSequenceNumber |
除去 MLLP 字节时出错。MSA 应答代码将设置为“AR”,并且 MSA.3.TextMessage 字段将设置为“MLLP 错误 - 缺少起始字节”。
验证入局 MSH 或执行重复数据删除时出错。MSA 应答代码将设置为“AE”,并且 MSA.3.TextMessage 字段将设置为“输入消息解析或验证错误”。
应用顺序逻辑时出错。MSA 应答代码将设置为“AR”,并且 MSA.3.TextMessage 字段将设置为“Sequence 节点中发生了内部故障”。
将 HL7 消息存储到队列中时出错。MSA 应答代码将设置为“AR”,并且 MSA.3.TextMessage 字段将设置为“将消息提交到处理方队列中时出错”。
源消息将写入一个或多个队列中,以进行变换和路由。 对于此模式的每个部分,此消息将写入一个队列,此模式的各个部分随后将路由到所需数目的目标。
TransformAndRoute 流从队列中读取 HL7 消息。
如果选中了“报告其余项”参数,那么将对“其余”字段执行检查,这些字段是存在于段中,但未在用于解析入局消息的 HL7 消息中进行建模的附加字段。如果找到了“其余”字段,那么这些字段将写入队列或进行发布。此选项在开发期间用于标识附加字段并确定这些字段的处理方式。
HL7 消息将变换为其 XML 规范格式并传递到 SubCustomize 子流。缺省情况下,此子流仅传递消息而不执行任何其他操作。但是,此子流为您提供了一个位置,您可以在其中引入对特定模式实例的定制,而不更改流的结构。
如果选择了“规范订阅源”参数,那么此时将输出规范格式,请参阅模式实例的输出。您可以使用输入消息的规范格式作为其他不接受基本 HL7 消息的应用程序的订阅源。
此模式针对其各个部分提供了多达 6 个目标。您可以单独地对每个目标进行配置。如果您选择的目标数少于 6,那么将仅配置所选目标。对于每个目标,TransformAndRoute 流会向 TransformAndRoute 流的过滤子流发送消息副本。对于每个目标,将应用过滤器以确定是否将入局消息发送到目标。每个目标的过滤子流 DestnFilter(其中 n 是目标编号)由模式参数进行配置,以生成允许的“消息代码/消息事件”对列表。只有那些匹配的消息才会传递到目标应用程序。
除目标的“排序操作”参数设置为“不执行排序”的情况外,每当过滤掉一条消息时,都会向发送方 DestnSender 子流传递一条伪消息,其中 n 是目标的编号。为了维护来自源的消息的正确顺序,这条伪消息是必需的。
完成消息过滤后,每条必需消息都将重新变换为 HL7 格式。如果选择了“段过滤”参数,那么目标的“段过滤器”表中列出的所有段都将在变换过程中除去。
随后,消息将通过定制子流进行传递。缺省情况下,此子流仅传递消息而不执行任何其他操作。但是,此子流为您提供了一个位置,您可以在其中引入对特定模式实例的定制。 最后,消息将写入“发送方”流的队列。
对于每个目标,将创建单独的消息流 DestnSender 子流,其中 n 是目标的编号。
可以对目标执行严格或宽松的排序,这由“排序操作”模式参数确定。如果选择了“严格”排序,那么将在“发送方”流中包含一个无限期超时的 Resequence 节点。如果消息不按顺序到达,那么它们将在缺失的消息到达之前一直保留在排序队列中。如果选择了此选项,那么必须对暂挂消息所在的系统队列进行监视,并执行操作以提供缺失的消息。
对于成功交付到目标的每条消息,源中的序号以及“发送方”流中的所有重新排序将随时间戳记和与指定为 Destn(其中,n 表示目标的编号)的目标相对应的序列组一起写入 QueuePrefix.SEQNOS 队列,其中 QueuePrefix 由“队列前缀”参数定义。
如果选择了“消息过滤”选项,那么进行了严格排序的事件和某些消息不会传递到目标。在这种情况下,进行重新排序并将新的序号应用于下列消息(在这些消息传递到目标之前)之后,表示这些未交付消息的伪消息将被除去。
如果选择了“宽松”排序选项,那么一般情况下,消息将按顺序交付,但如果在“排序超时”参数指定的时间段之后缺失消息,那么将向通知队列发送一条消息,并且消息流将继续。缺失的消息将在到达后插入流中。缺失消息到达后,还将写入 .SEQNTFY 队列。
缺省情况下,系统排序队列定义如下:
如果对于某个模式选择了“单独的排序队列”参数,那么特定于此模式实例的排序队列将通过使用“队列前缀”参数进行定义,如下所示:
这些非缺省排序队列由名为 patternInstance_setSeqQs 的可配置服务定义。此模式实例创建了一个名为 patternInstance.resequence.configurableservice 的文件,其中包含必须在运行此模式实例的集成节点上创建的此服务定义。另外,“发送方”流还配置为使用这个可配置服务。
如果目标不要求进行排序,那么将忽略流中的 Resequence 节点以及关于缺失消息的报告。
GenericHL7Output 节点为目标应用程序准备消息,从而将消息更改到位流中,并在开头添加所需的 Minimal Lower Layer Protocol (MLLP) 定界符字节 0B。然后,GenericHL7Output 节点将这条准备好的消息转发到 TCP/IP 输出节点,后者尝试将此消息发送到目标应用程序。
如果目标应用程序返回了“AA”成功代码,那么“Environment.PatternVariables.FlowMilestoneReached”变量将清除,并且消息将传递到“输出”终端。
如果目标应用程序返回了“AE”响应码,那么“Environment.PatternVariables.FlowMilestoneReached”变量将设置为“ACKAE”,并且消息将传递到“故障”终端。返回“ACKAE”响应后,不会进行重试。
如果成功发送了消息但未接收到应答,或者接收到无效应答,那么将按照处理“AE”响应的方式处理这种情况,但是,在消息传递到“故障”终端之前,“Environment.PatternVariables.FlowMilestoneReached”变量将设置为“TIMEOUT”、“RECEIVEACK”或“ACKERROR”。不进行重试。
如果 GenericHL7Output 节点未能将消息发送到目标,或者如果从目标返回了“AR”应答,那么消息将传递到“记录重试”终端。完成记录后,将在返回控制权时重试发送消息,直到发送成功或重试次数达到了“重试限制”参数设置的限制。
达到重试限制后,“Environment.PatternVariables.FlowMilestoneReached”变量将设置为“ACKARTOOMANYREPEATS”,并且消息将传递到“故障”终端。
基于目标选择内容验证,方法是将 “验证” 参数用于 文档通信 部分中。对目标选择验证后,在相关“发送方”流的 MQInput 节点上, “验证” 参数将设置为 “内容” 。此节点上的“解析计时”属性由模式定义为“立即”,以便在验证后再进行任何进一步处理。验证仅提供针对 HL7v25P 消息集的消息验证。例如,它未提供从属字段的完全 HL7 验证。
HL7v25P 消息集与 MRM 解析器配合使用,以解析和编写 HL7 消息。生成的消息树可以序列化为 XML 规范格式。 消息定义非常灵活,足以容纳局部变体而不需要定制,并且它们还可以进行扩展,以允许解析局部定义的 Z 段和额外的字段。如果出现了局部变体并且必须处理这些局部变体中的数据,那么必须修改 HL7 模型,以使其符合匹配的规范,从而确保可访问所有数据。
您的组织可以使用规范格式来存放在任何操作系统上运行的数据的表示。此数据的格式可能是标准化的日期及时间、数字格式或者您的组织实施的任何其他数据标准化要求。规范格式表示源应用程序与目标应用程序的分离,从而支持最大程度的复用和最小程度的维护。此规范格式的定制子流包含在您生成的模式中。
HL7v25P 消息集包含 HL7 V2.5 规范中定义的所有段的全局元素定义。每个段中的组件和子组件都通过正确的定界符进行建模。您可以使用名为“HL7”的通用消息定义来解析 HL7 段的任何序列。
注意:IBM Integration Bus 中提供的 Healthcare 样本也具有 HL7 消息集。为了避免冲突,IBM Integration Bus Healthcare Pack 所使用的消息集具有其他名称 (HL7v25P)。HL7v25P 消息集较新,并且是您必须与“Healthcare:从 HL7 到 HL7”模式配合使用的消息集。
除路由到指定目标的 HL7 消息以外,此模式还提供了众多其他输出。这些输出将写入队列或发送到 Publication 节点。目标由“发布”模式参数确定。如果选中了“发布”选项,那么所有信息都将使用以模式实例名开头的主题层次结构进行发布。
如果选择了“写入队列”选项,那么输出将发送到一些队列,这些队列的名称根据模式参数“队列前缀”和一组固定后缀生成,如下表所示。
注意:未显示每个主题和队列的初始构面(模式实例名)。
| 输出 | 队列 | 主题 | 备注 |
|---|---|---|---|
| 源订阅源 | .SRC | /Receiver/Source | 将编写接收到的源消息的副本。 |
| 日志 | .JRNL | /Receiver/Journal | 此输出以标准模式格式提供入局消息的日志。 请参阅“注 1”。 |
| 目标 TransformAndRoute 流 | .RXFn | 不适用 | 对于每个目标,将向 TransformAndRoute 流发送消息。 |
| 出错的消息 | .ERR | 不适用 | 无法正确处理的消息将写入错误队列,并且错误信息包含在 MQRFH2 头中。 |
| 用于重复检查的消息标识 | .DUPID | 不适用 | 消息标识及关联的 ACK 消息将进行存储,以便与稍后的入局消息进行比较,从而检测重复消息。
请参阅“注 2”。 |
| 其余 | .REM | /Remainders | 可以选择性地编写具有“其余”字段的消息。 |
| 规范 | .CAN | /Canonical | 如果选中了输出规范订阅源的选项,那么将编写输入消息的规范 XML 格式。 |
| 目标“发送方”流 | .DESTn | 不适用 | 对于每个目标,将向“发送方”流发送消息。 |
| 数据排序 | SYSTEM.BROKER.EDA.EVENTS | 不适用 | 这是缺省情况下“发送方”流中的 Resequence 节点所使用的系统队列。 |
| 数据排序 | SYSTEM.BROKER.EDA.COLLECTIONS | 不适用 | 这是缺省情况下“发送方”流中的 Resequence 节点所使用的系统队列。 |
| 数据排序 | SYSTEM.BROKER.EDA.QueuePrefix.EVENTS | 不适用 | 这是选择了“单独的排序队列”选项的情况下,“发送方”流中的 Resequence 节点所使用的队列。 |
| 数据排序 | SYSTEM.BROKER.EDA.QueuePrefix.COLLECTIONS | 不适用 | 这是选择了“单独的排序队列”选项的情况下,“发送方”流中的 Resequence 节点所使用的队列。 |
| 序列消息的输出 | .SEQNTFY | 不适用 | 如果选择了“宽松”排序选项,那么未按顺序到达的消息将写入此队列并交付到目标。 |
| 序号 | SEQNOS | 不适用 | 此队列记录交付到各个目标的最新序号。如果选择了“严格”排序选项,那么此队列将用于确定交付到目标的最后一个序号。 |
注 1:通过添加 MQMD 头和 MQRFH2 头,可以根据源消息生成日志消息。MQRFH2 头包含以下内容:
注 2:每条消息到达时,消息标识队列都将对其进行检查,以查找具有同一标识的先前消息。对这些消息指定了超时(由某个消息参数确定),在此时间之后,将从队列中除去这些消息。因此,将仅在指定的时间段内查找重复项,缺省值为 24 小时。