附件是优化 Connect 处理大型邮件方式的一种方式。
使用附件可以减少数据库中存储的数据量。如果在消息浏览器中查看消息,可以看到在原始选项卡、转换选项卡和编码选项卡中显示了消息 blob。其中每一个都表示数据库中的一个条目。使用邮件附件,可以大大减少存储的数据量,因为通常只需存储一次附件。之后,它们由其 ID 引用。 内容
- 附加整个消息
- 使用正则表达式的附件
- 使用 JavaScript 的附件
- 使用 DICOM 的附件
- 使用自定义附件处理程序的附件
- 操作连接器内的附件
- 删除附件
- 跨渠道附件
- 关键事实
附加整个消息
在 医易通中使用附件的最简单方法之一就是附加整个消息。例如,假设您有一个 HTTP 侦听器,您知道它将获取 PDF 文件。如果您要像这样设置侦听器:
然后,您将在消息中看到以下内容:
但是,如果您要配置频道以将整个邮件存储为附件: 然后,您将看到以下内容:
如您所见,PDF 字节不再存储在消息中,甚至在预处理器之前就已提取。
使用正则表达式
的附件 有时,您可能需要处理消息中的一部分而不是整个消息的大对象数据 blob 部分作为附件。例如,如果图像嵌入到 HL7 消息中,该怎么办?这是使用“正则表达式附件”选项的良好方案。
在此示例中,嵌入了一个图像,我们将该部分转换为附件并将图像写入文件系统。
在源连接器中,在“附件”下拉列表中选择“正则表达式”,然后输入正则表达式。OBX 5.5
正则表达式代码段:
(?:OBX\|(?:[^|]*?\|){4}(?:[^|^]*?\^){4})([^|^]*)[|^]
现在,添加目标文件编写器。在目标中,添加要映射到的 Transformer Mapper 步骤。OBX 5.5attachmentId
这将允许我们通过附件 ID 获取图像并写入它。请务必检查文件类型: 。最后,将“文件编写器”目标模板设置为:。这将替换为实际的 attachmentId,然后将替换为附件本身。
现在保存并部署通道并发送测试消息。(您可以使用下面随附的内容进行测试,其中包含 Base 64 编码的 PNG 测试图像)。如果一切顺利,您应该会在指定的目录中看到一个图像。
使用 JavaScript 的附件
您还可以使用 JavaScript操作附件。使用相同的“附件”下拉列表,选择“JavaScript”,然后单击“属性”。添加以下内容以将邮件提取到附件中,向其添加单词“world”,然后将邮件更改为附件 ID。Binary{attachmentId}test_message.txt
JavaScript 代码段:
var attachment = addAttachment(message + " world", "text/plain", false); return attachment.getAttachmentId();
现在,如果您发送带有“hello”一词的测试消息,则收到的任何消息都会得到“hello world”。请记住,在目标发送邮件之前,它会将附件 ID 替换为附件。
使用DICOM附件
通过 Connect 传入的一些较大的消息属于 DICOM类型。为了使 DICOM 处理尽可能高效,已经进行了大量的性能测试和调整,但正确配置通道以利用这些改进仍然很重要。
最好将 DICOM 邮件存储为附件,并确保 Connect 执行此操作,您需要将源数据类型设置为“DICOM”,这也会自动选择 DICOM 附件类型。相反,如果使用“RAW”数据类型,则大型 DICOM 消息将在整个消息处理管道中多次复制,占用更多空间并使用更多内存。
使用自定义附件处理程序
的附件
对于勇敢的 Java 用户,也可以编写自己的 Java 类来解析和操作附件。请注意,该类必须扩展 MirthAttachmentHandlerProvider。
使用自定义附件处理程序,天空是极限。例如,此图显示了我创建并导入为库的自定义附件处理程序示例。这使用正则表达式来解析图像,并在附加之前垂直翻转图像。
结果:
操作连接器内的附件
还可以使用连接器中的附件。假设您已经设置了一个频道来解析附件,但您希望在发送附件之前对其进行编辑。这是完全可行的,我们添加了一些新的 JavaScript 方法来帮助您做到这一点。
您可以从源变压器内部执行以下操作。
JavaScript 代码段:
// Get a list of the attachments associated with this message var attachmentList = getAttachments(false) // From the list of attachments, get the first one var attachment = attachmentList.get(0); // Get the content of the attachment var newString = attachment.getContentString(); // Append to the attachment content newString = newString + "*Some Additional Content*"; // Write the new content back to the attachment attachment.setContentString(newString); // Update the attachment updateAttachment(attachment, false);
另一种方法可以执行此操作(可能减少内存消耗):
// Get a list of the Ids of the attachments associated with this message var attachmentIdList = getAttachmentIds(); // From the list of attachment Ids, get the first one var attachmentId = attachmentIdList.get(0); // Get the attachment associated with the Id var attachment = getAttachment(attachmentId, false); // Get the content of the attachment var newString = attachment.getContentString(); // Append to the attachment content newString = newString + "*Some Additional Content*"; // Write the new content back to the attachment attachment.setContentString(newString); // Update the attachment updateAttachment(attachment, false);
请注意,还有一些用户实用程序方法允许您从其他完全不相关的频道检索附件。只要知道频道 ID 和消息 ID,就可以获取相关的附件。
以下是其中一些实用方法的样子:
getAttachment(channelId, messageId, attachmentId, base64Decode); getAttachmentIds(channelId, messageId); updateAttachment(channelId, messageId, attachmentId, data, type, base64Encode); updateAttachment(channelId, messageId, attachment, base64Encode);
删除附件
请注意,对于所有附件类型,如果您的频道和后续目标根本不关心附件数据,您可以通过取消选中频道配置屏幕上的“存储附件”复选框来进一步减少磁盘使用量,这将像往常一样从您的邮件中提取附件,但不会存储附件
。请务必注意,这意味着无法检索附件数据。
跨渠道附件
如果您的 Connect 通道的附件作为邮件处理管道的一部分发送到另一个通道,
该怎么办?在这种情况下,附件将被提取并保存,然后在发送到第二个通道之前重新连接,然后第二个通道将在重新附加和发送消息之前提取并保存附件。这是一个次优情况,因为附件被提取和保存了两次,但可以改进。
将“重新附加附件”单选按钮设置为“否”时,附件在发送到目的地之前不会重新连接。相反,除了常规附件 ID 之外,在邮件中找到的任何附件都将展开为包括频道 ID 和邮件 ID,这允许下游频道正确处理它收到的附件。
下行通道现在将接收已从上行通道提取的附件,这意味着上行通道不再重新连接,下游通道不再重新提取,从而节省时间和磁盘空间。
关键事实
- 附件在预处理器之前从消息中提取。
- 附件数据将替换为附件 ID。