搜索​​​​

清除过滤器
文章
Michael Lei · 一月 27, 2022

轻松一下,完成冬奥小调查,赢积分,抽奖品!

欢迎到我们Global Master 网站完成冬奥小游戏,赢积分,抽奖品(雨伞/保温杯/T-Shirt)。 https://globalmasters.intersystems.com/channels/72 不知道如何玩转Global Master, 请参考:认识Global Masters 倡导中心,从这里开始! | InterSystems Developer Community | Global
文章
Louis Lu · 十一月 2, 2021

IRIS 2021 技术文档 First Look 35 -- 使用 Production 进行大文件传输(Managed File Transfer, MFT)

本文介绍了 InterSystems IRIS®数据平台中的大文件传输(Managed File Transfer,MFT)集成选项,它使您能够轻松地将第三方文件传输服务直接集成到 InterSystems IRIS 产品中。本文还包括在新产品中使用 MFT 的逐步指导。 要浏览所有的技术概要(First Look),包括可以在 InterSystems IRIS 免费的评估实例上执行的那些,请参见 InterSystems First Looks(《InterSystems 技术概要》)。 在 InterSystems IRIS 中使用 MFT 的好处 许多拥有 InterSystems IRIS 产品的网站也使用文件传输服务,如 Box、Dropbox 或 Accellion kiteworks,以实现安全、符合 HIPAA 的文件共享。然而,这种服务的使用取决于终端用户是否愿意使用它。在没有强制执行的情况下,他们可能很容易忘记这样做,或者有时干脆选择将文件作为附件发送。通过将 MFT 服务集成到您的产品中,您可以确保文件总是被安全地发送。另一个好处是,由于产品可以根据需要自动地将敏感文件路由到正确的位置,并遵循适当的工作流程,因此,错位或错误指向文件的风险更小。 考虑以下用例:一家职业介绍所将潜在员工的常规体检或药物测试外包给门诊医疗测试机构。测试机构和职业介绍所都有责任确保私人信息的安全数据传输,并在彼此之间进行传输。然而,虽然医疗机构可能已经有了符合 HIPAA 的程序,并可能已经使用了安全文件传输服务,但职业介绍所可能没有适当的基础设施来处理所需的安全级别。在任何一端设置启用 MFT 的 InterSystems IRIS 产品,均可简化所有此类通信的标准化文件传输服务的使用。 对于需要向内部和外部位置(location)提交相同文件的企业来说,或者当单个部门接收到需要根据发件人进行不同处理的文件时,MFT 也非常有用。例如,假设一家汽车经销商需要将签署的客户财务文件传送到他们的总部以及金融机构。另外,假设销售部门与租赁部门有不同的流程(即使这两个部门必须向同一家银行提交相同类型的信息)。这些差异可能会导致混乱和错位或发送错误的文书工作。此外,经销商不能也不应该将客户签署的财务或其他个人数据作为常规电子邮件的附件发送。使用集成了 MFT 的 InterSystems IRIS 产品简化了提交和路由过程,以便将正确的文档送到正确的部门进行适当的处理,从而减少了文档丢失的机会。 它是如何工作的? InterSystems IRIS 提供了业务主机,您可以将其添加到产品和配置中,而不需要编程。这些业务主机支持 Box、DropBox 和 Accellion kiteworks 服务。一旦您添加了这些业务主机并配置了它们,产品就可以轻松地从终端用户帐户检索文件,或将文件放入这些帐户,或两者都是。 InterSystems IRIS 使用开放授权框架(Open Authorization Framework)2.0 版本(称为 OAuth 2.0)授权对第三方传输服务的访问。当您配置 InterSystems IRIS 产品来使用传输服务时,您将该产品设置为传输服务帐户的授权用户。这允许产品从该帐户下的任何目录(例如分配给单个终端用户的目录)中提取文件并将文件放入其中。这些个人 终端用户的访问完全不受任何影响,他们可以继续像以前一样放置和检索文件。 尝试 MFT:创建启用 MFT 的产品 将 MFT 集成到 InterSystems IRIS 产品中只需要几个步骤:首先,创建并初始化与传输服务的连接,然后包括适当的业务主机,使产品能够直接与传输服务对话。您可以按照本节中的步骤创建一个在您的 Accellion kiteworks 帐户和您的本地桌面系统之间复制文件的产品,就可以看到它是多么简单。如果您更习惯或已经可以访问 Box 或 DropBox,只需在使用 kiteworks 的地方为您的服务替换这些项目。 重要提示: 为了简单起见,使用这些说明创建的产品使用默认设置。在创建实时产品时,InterSystems 强烈建议您根据您的环境来调整设置,特别是那些与安全和您自己特定的 InterSystems IRIS 实例有关的设置。例如,下面提到的 Redirect URL(重定向 URL) 使用 http 而不是 https,这在产品中不是一个好的做法。 想试试 InterSystems IRIS 互操作性功能的在线视频演示吗?请查看 Interoperability QuickStart(互操作性快速入门)! 用前须知 要使用这个程序,您需要一个正在运行的 InterSystems IRIS 实例。您对 InterSystems IRIS 的选择包括多种类型的已授权的和免费的评估实例;该实例不需要在您工作的系统中(尽管它们必须相互具有网络访问权限)。有关如何部署每种类型的实例的信息(如果您还没有可使用的实例),请参见 InterSystems IRIS Basics: Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中的 Deploying InterSystems IRIS(部署 InterSystems IRIS)。 您还需要对 Accellion kiteworks 上的帐户进行管理访问;您可以在 https://www.accellion.com/kiteworks/ 上创建一个免费试用帐户。 创建 TLS 配置 使用以下程序创建一个 TLS 配置: 使用 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中为您的实例描述的 URL,在浏览器中打开您的实例的管理门户(Management Portal)。 导航到 TLS 配置页面(System Administration(系统管理) > Security(安全) > SSL/TLS Configurations(SSL/TLS 配置))。 点击 Create New Configuration(创建新的配置) ,并为 Configuration Name(配置名称) 字段输入 MFTTLSConfig。让所有其他字段保持原样,并点击Save(保存)来保存这个新的配置。 在传输服务中注册您的 InterSystems IRIS 实例 接下来,您需要在传输服务本身上为这个 MFT 产品创建一个应用程序(条目)。在一个单独的浏览器窗口或标签中,进入您的 Accellion kiteworks 帐户的管理页面并执行这些步骤。 在管理门户(Management Portal)中,进入 Customs Applications(自定义应用程序)页面,该页面在 Application(应用程序) > Client Management(客户端管理)(适用于 kw2017.02.04 版本)下。 添加一个新条目,并为应用程序指定一个名称,如 ISCFileTransferApp。 请确保 Authorization Code(授权代码)和 Enable Refresh Token(启用刷新令牌)被选中。 在 Redirect URI(重定向 URI) 字段中,输入 URL http://server:port/csp/sys/oauth2/OAuth2.Response.cls,其中服务(server) 和端口(port) 是您的实例的主机标识符和 web 服务器端口。例如,对于一个云实例,URL可能是 http://35.192.42.98:52773/csp/sys/oauth2/OAuth2.Response.cls 本地安装的实例可以在服务(server) 字段中使用 localhost。 这是 kiteworks 用来联系 InterSystems IRIS 实例的 URL。 点击 Add Application(添加应用程序)并记录显示的安全令牌(Client Application ID(客户端应用程序 ID) 和 Client Secret Key(客户端密钥))。稍后在 InterSystems IRIS 上创建 TLS 连接时将使用此信息。 重要提示: 此信息只有在这个时候对您可用,所以您必须立即记录它。如果您在 InterSystems IRIS 产品上创建 TLS 连接时没有此信息,那么您必须再次生成此信息并使用新的值来创建 TLS 连接。 在传输服务中添加目录 现在导航到主 kiteworks(非管理)Folders(文件夹)页面,其中显示您的文件和目录,并创建两个新的顶级目录,一个名为 FilesReceived,用于接收文件,另一个名为 FilesToSend,用于发送文件。 添加可访问 InterSystems IRIS 的目录 现在您应该在实例的主机上创建两个目录,InterSystems IRIS 将在其中访问文件。执行此操作的方法取决于您所使用的实例类型 ,如下所示: 对于由 ICM 部署的实例,可以使用带有 -machine 和 -interactive 选项的 icm exec 命令,在运行实例的容器内打开 bash shell,例如: icm exec -command bash -machine MYIRIS-AM-TEST-0004 -interactive 然后您可以在容器文件系统上创建目录。 对于任何容器化的实例, 无论是授权版还是社区版(Community Edition),使用命令 docker exec -it container_name bash 在容器中打开 bash shell (社区版[Community Edition]容器的名称是 try-iris)。然后在容器文件系统上创建目录。 对于 InterSystems 学习实验室(Learning Labs),使用集成 IDE 中的命令行终端,在 Shared 文件夹中创建新文件夹;您可以在 /home/project/shared 下的管理门户(Management Portal)中浏览到这些。 对于已安装的实例,在本地文件系统上创建目录。 这个文本假设在 Windows 系统上安装的实例有以下目录路径;替换您创建的实际目录的路径。 C:\InterSystems\ToRemote C:\InterSystems\FromRemote 创建 MFT 连接 接下来,您需要通过创建 MFT 连接对象在 Intersystems IRIS 上注册传输服务。要做到这一点,请返回管理门户(Management Portal),进入 Managed File Transfer Connections(托管文件传输连接)页面(System Administration[系统管理] > Security(安全)> Managed File Transfer Connections[托管文件传输连接])。点击 Create Connection(创建连接)。请以以下方式指定字段的值,然后点击 Save(保存): Field Name(字段名称) Value(值) Connection Name(连接名称) KiteSecured File management service(文件管理服务) Kiteworks SSL/TLS configuration(SSL/TLS 配置) MFTTLSConfig Email address(电子邮件地址) 您的 Kiteworks 管理员的电子邮件地址,例如 MFTadmin@yourcompany.com Base URL(基准 URL) 您企业的 kiteworks 的根 URL,例如 https://yourcompany.kiteworks.com/ OAuth 2.0 application name(OAuth 2.0 应用程序名称) ISCFileTransferApp OAuth 2.0 client id(OAuth 2.0 客户端 id) 之前从 kiteworks 检索到的 Client Application ID(客户端应用程序 ID) OAuth 2.0 client secret(OAuth 2.0 客户端机密) 之前从 kiteworks 检索到的 Client Secret Key(客户端密钥) OAuth 2.0 redirect URL(OAuth 2.0 重定向 URL) 留空。一旦您填写了 Host name(主机名) 和 Port(端口),该字段将自动使用前面提供的 Redirect URI(重定向 URI) 的值填充。 Use TLS/SSL(使用 TLS/SSL) (清除复选框) Host name(主机名) 您的实例的主机标识符。 Port(端口) 您的实例的 web 服务器端口。 Prefix(前缀) (留空) 获取访问令牌 Managed File Transfer Connections(托管文件传输连接)页面会再次显示所有可用的连接,包括您刚刚创建的新连接。如果该连接的状态是 Not Authorized,那么: 点击 Get Access Token(获取访问令牌) 以显示来自 kiteworks 的 Oauth 同意页面,该页面识别了您之前注册的应用程序的名称(ISCFileTransferApp)。 点击 Grant Access(授予访问权限)来授权访问。这将重新显示 Connections(连接) 列表,新的 MFT 连接的状态现在被列为 Authorized。 创建命名空间 为了创建产品,您必须有一个启用互操作性的命名空间。如果您已经创建了一个启用互操作性的命名空间,您可以把它用于此产品。要创建一个新的启用互操作性的命名空间,请使用以下程序。(您首次安装 InterSystems IRIS 时创建的命名空间没有启用互操作性。) 在管理门户(Management Portal)主页上,选择 System Administration(系统管理) > Configuration(配置) > System Configuration(系统配置) >Namespaces(命名空间),进入 Namespaces(命名空间)页面。 在 Namespaces(命名空间)页面,选择 Create New Namespace(创建新的命名空间)。这将显示 New Namespace(新的命名空间)页面;按照 System Administration Guide(《系统管理指南》)的“Configuring InterSystems IRIS(《配置 InterSystems IRIS》)”章节中 Create/Modify a Namespace(创建/修改命名空间)中的使用说明,确保选中了 Enable namespace for interoperability productions(启用互操作性产品的命名空间)复选框。 选择靠近页面顶部的 Save(保存),然后在生成的日志末尾选择 Close(关闭)。 创建产品 接下来,您需要切换到新的命名空间来创建新的产品本身。 进入 InterSystems IRIS 管理门户(Management Portal)主页,在顶部横幅的中间部分找到命名空间标识符。点击 Switch(切换)链接以调出 Namespace Chooser(命名空间选择器)。 选择您刚刚创建的命名空间(例如,ForMFT),然后点击 OK(确定)。 现在导航到 Production(产品) 页面(Interoperability(互操作性) > Configure(配置) > Production(产品))。 点击 New(新建)以调出 Production Wizard(产品向导)。 对于 Package(包),从下拉菜单中选择 INFORMATION(信息)。 输入 Production Name(产品名称),如 NewMFTProduction。 将 Production Type(产品类型)保留为 Generic(通用型),然后点击 OK(確定)来创建产品。 有关产品的更多信息,请参见 Introducing Interoperability Productions guide(《介绍互操作性产品指南》)的 "Introduction to InterSystems IRIS Interoperability(《InterSystems IRIS 互操作性介绍》)"一章中的 "Introduction to Productions(产品介绍)"。 创建业务操作和业务服务 留在新创建的产品中,并添加文件传输所需的四种业务操作和服务(每个方向一个业务操作和一个业务服务): 业务主机名 主机类型 用于 SecureToRemoteOffice 业务操作 发送文件到传输服务 GatherLocalFiles 业务服务 发送文件到传输服务 StoreFilesLocally 业务操作 从传输服务中接收文件 ReceiveFromRemoteOffice 业务服务 从传输服务中接收文件 创建和配置:SecureToRemoteOffice SecureToRemoteOffice 是将文件发送到传输服务的业务操作(Operation)。为了将它添加到产品中: 点击 Operations(操作)旁边的加号。 选择 Operation Class(操作类) EnsLib.MFT.Operation.Passthrough。 输入 Operation Name(操作名称) SecureToRemoteOffice。 请确保未选中 Enable Now(立即启用),并保留其他字段。 点击 OK(确定)来添加该操作。 选择该操作,然后从右侧的面板进入 Settings(设置)标签。 在 Basic Settings(基础设置)部分,仅配置以下内容: Field Name(字段名称) Value(值) 说明 Enable(启用) (在方框内打勾) 启用该业务主机 MFT Connection Name(MFT 连接名称) KiteSecured 之前创建的 TLS 配置的名称 Default MFT Folder(默认的 MFT 文件夹) /FilesReceived/ 传输服务的顶级接收目录的名称 Default Filename Specification(默认的文件名规范) %f 用于创建接收文件名称的模板 将所有其他字段保留为默认设置,并点击 Apply(应用)来保存您的更改。 创建和配置:GatherLocalFiles GatherLocalFiles 是用于收集从 InterSystems IRIS 发送的文件的业务服务(Service)。为了将它添加到产品中: 点击 Services(服务)旁边的加号。 选择 Service Class(服务类) EnsLib.File.PassthroughService。 输入 Service Name(服务名称) GatherLocalFiles。 请确保未选中 Enable Now(立即启用),并保留其他字段。 点击 OK(确定) 来添加该服务, 选择该服务,然后从右侧的面板进入 Settings(设置)标签。 在 Basic Settings(基础设置)部分,仅配置以下内容: Field Name(字段名称) Value(值) 说明 Enable(启用) (在方框内打勾) 启用该业务主机 File Path(文件路径) C:\InterSystems\ToRemote\ 您的本地系统中包含要发送的文件的目录(如果不同,请用正确的路径代替)。 File Spec(文件规范) * 要发送的文件名的正则表达式 Target Config Names(目标配置名称) SecureToRemoteOffice 从此业务服务接受输入的业务主机 将所有其他字段保留为默认设置,并点击 Apply(应用)来保存您的更改。 创建和配置:StoreFilesLocally StoreFilesLocally 是在 InterSystems IRIS 中存储接收到的文件的业务操作(Operation)。为了将它添加到产品中: 点击 Operations(操作)旁边的加号。 选择 Operation Class(操作类) EnsLib.File.PassthroughOperation。 输入 Operation Name(操作名称) StoreFilesLocally。 请确保未选中 Enable Now(立即启用),并保留其他字段。 点击 OK(确定)来添加该操作。 选择该操作,然后从右侧的面板进入 Settings(设置)标签。 在 Basic Settings(基础设置)部分,仅配置以下内容: Field Name(字段名称) Value(值) 说明 Enable(启用) (在方框内打勾) 启用该业务主机 File Path(文件路径) C:\InterSystems\FromRemote\ 您的本地系统中存储所接收的文件的目录(如果不同,请用正确的路径代替)。 File Name(文件名称) %f_%Q%!+(_a) 要发送的文件名的语法。为了保证唯一性,InterSystems 建议在文件名中加入日期和时间戳。 将所有其他字段保留为默认设置,并点击 Apply(应用)来保存您的更改。 创建和配置:ReceiveFromRemoteOffice ReceiveFromRemoteOffice 是用于从您的传输服务接收文件的业务服务(Service)。为了将它添加到产品中: 点击 Services(服务)旁边的加号。 选择 Service Class(服务类)EnsLib.MFT.Service.Passthrough。 输入 Service Name(服务名称) ReceiveFromRemoteOffice。 请确保未选中 Enable Now(立即启用),并保留其他字段。 点击 OK(确定)来添加该服务。 选择该服务,然后从右侧的面板进入 Settings(设置)标签。 在 Basic Settings(基础设置)部分,仅配置以下内容: Field Name(字段名称) Value(值) 说明 Enable(启用) (在方框内打勾) 启用该业务主机 MFT Connection Name(MFT 连接名称) KiteSecured 之前创建的 TLS 配置的名称 MFT Source Folders(MFT 源文件夹) /FilesToSend 传输服务的顶级发送目录的名称 Files to Retrieve(检索的文件) (留空) 从远程位置收集的文件名称(类型)的模板 Target Config Names(目标配置名称) StoreFilesLocally 从此业务服务接受输入的业务主机 将所有其他字段保留为默认设置,并点击 Apply(应用)来保存您的更改。 测试产品 现在,您已经创建了产品,是时候尝试一下了!只需将文件拖放到您的本地目录和第三方传输服务的指定文件夹中,就可以看到它们出现在另一个位置。 通过点击顶部的 Start(启动) 按钮来启动产品,然后在 Start Production(启动产品)对话框中点击 OK(确定)。 要验证发送到 kiteworks 的文件: 使用操作系统的目录资源管理器,导航到添加 GatherLocalFiles 业务服务时,您在 FilePath(文件路径)字段中指定的目录(C:\InterSystems\ToRemote\ 或您创建的其他目录)。 在该位置放置一个文件。 进入 kiteworks 并导航到 /FilesToRemote/ 文件夹,(添加 SecureToRemoteOffice 业务操作时,您在 Default MFT Folder(默认的 MFT 文件夹)字段中指定的目录)。 刷新文件夹视图,直到新文件出现。这通常是在几秒钟内,甚至更早。 要验证从 kiteworks 接收的文件: 进入 kiteworks 并导航到 /FilesToCentral 文件夹(添加 ReceiveFromRemoteOffice 业务服务时,您在 DefaultMFTFolder(默认的 MFT 文件夹)字段中指定的目录)。 在该位置放置一个文件。 使用您的 OS 目录资源管理器,导航到添加 StoreFilesLocally 业务操作时,您在 FilePath(文件路径) 字段中指定的目录 (C:\InterSystems\FromRemote\ 或您创建的其他目录)。 刷新目录视图,直到新文件出现。这通常是在几秒钟内,甚至更早。 祝贺您,您刚刚成功地使用 MFT 创建了一个工作的production! 了解有关 MFT 的更多信息 更多信息,请参见: Video Introduction to Managed File Transfer(《托管文件传输视频简介》) Enabling Productions to Use Managed File Transfer Services(《启用Production使用大文件传输》)
文章
姚 鑫 · 二月 23, 2021

第四十五章 Caché 变量大全 $ZVERSION 变量

# 第四十五章 Caché 变量大全 $ZVERSION 变量 包含一个字符串,描述`do`命令后面的InterSystems IRIS.line的当前版本。 # 大纲 ```java $ZVERSION $ZV ``` # 描述 `$ZVERSION`包含一个字符串,该字符串显示当前运行的InterSystems IRIS®Data Platform实例的版本。 以下示例返回`$ZVERSION`字符串: ```java DHC-APP>WRITE $ZVERSION Cache for Windows (x86-64) 2016.2 (Build 736U) Fri Sep 30 2016 11:46:02 EDT ``` 此字符串包括InterSystems IRIS安装的类型(产品和平台,包括CPU类型)、版本号(2018.1)、该版本中的内部版本号(内部版本号中的`“U”`表示UNICODE以及创建此版本的InterSystems IRIS的日期和时间。`“EST”`是东部标准时间(美国东部的时区),`“EDT”`是东部夏令时 通过调用`GetVersion()`类方法可以返回相同的信息,如下所示: ```java DHC-APP>WRITE $SYSTEM.Version.GetVersion() Cache for Windows (x86-64) 2016.2 (Build 736U) Fri Sep 30 2016 11:46:02 EDT ``` 以通过调用其他`%SYSTEM.Version`方法来获取此版本字符串的组成部分,可以通过调用以下命令列出这些方法: ```java DHC-APP> DO $SYSTEM.Version.Help() 'Do $system.Version.Help(method)' 将显示单个方法的完整描述. 类的方法:%SYSTEM.Version FeatureBits(bit) Return all the feature codes stored in $zversion(0) Format(Format,zv) Formats the version info according to the following format types: GetBuildDate(zv) Returns the date the product was built in $HOROLOG format. GetBuildNumber(zv) Returns the build number for the product. GetBuildOS(zv) Returns the operating system for which the product was built. GetBuildTime(zv) Returns the time of day the product was built in $HOROLOG format. GetCompBuild(component) Returns the build number for the specified component. (Deprecated) ... ``` 通过转到InterSystems IRIS启动器并选择关于...,可以查看版本和内部版本号信息。 不能使用`SET`命令修改`$ZVERSION`特殊变量。尝试这样做会导致``错误。 # 示例 以下示例从版本字符串中提取创建日期,以计算InterSystems IRIS的当前版本有多早(以天为单位)。请注意,此示例特定于Windows平台: ```java /// d ##class(PHA.TEST.SpecialVariables).ZVERSION() ClassMethod ZVERSION() { SET createdate=$PIECE($ZVERSION," ",9,11) WRITE !,"Creation date: ",createdate WRITE !,"Current date: ",$ZDATE($HOROLOG,6) SET nowcount=$PIECE($HOROLOG,",") SET thencount=$ZDATEH(createdate,6) WRITE !,"This version is ",(nowcount-thencount)," days old" } ``` ``` DHC-APP>d ##class(PHA.TEST.SpecialVariables).ZVERSION() Creation date: Sep 30 2016 Current date: Feb 10 2021 This version is 1594 days old ``` 下面的示例通过调用类方法执行相同的操作: ```java /// d ##class(PHA.TEST.SpecialVariables).ZVERSION1() ClassMethod ZVERSION1() { SET createdate=$SYSTEM.Version.GetBuildDate() WRITE !,"Creation date: ",$ZDATE(createdate,6) WRITE !,"Current date: ",$ZDATE($HOROLOG,6) SET nowcount=$PIECE($HOROLOG,",") WRITE !,"This version is ",(nowcount-createdate)," days old" } ``` ```java DHC-APP>d ##class(PHA.TEST.SpecialVariables).ZVERSION1() Creation date: Sep 30 2016 Current date: Feb 10 2021 This version is 1594 days old ```
公告
Michael Lei · 五月 18, 2022

IRIS 和 IRIS for Health 社区版和企业版现在可以下载预览了!

所有人现在可以在 https://evaluation.intersystems.com下载IRIS和IRIS for Health社区和企业版 。 客户以及潜在客户都可以尝试我们最新最强的功能,包括一些还没有发布的新特性。 如何访问: 对于潜在客户,只要选择名称中带有"(预览)"的选项,就可以下载预览软件。 对于客户和InterSystems员工--只需拨动预览复选框,这将包括可用版本菜单下拉中的预览软件: 更多资源: https://community.intersystems.com/post/introducing-evaluation-service-community-edition-downloads https://community.intersystems.com/post/intersystems-evaluation-service 有任何问题欢迎拨打 4006019890 或咨询您的ISC客户经理。
文章
姚 鑫 · 九月 1, 2022

第十九章 维护本地数据库(四)

# 第十九章 维护本地数据库(四) # 压缩数据库中的全局变量 管理数据库空间的另一种方法是使用 `^DATABASE` 例程压缩数据库中的全局变量。压缩全局变量将全局数据合并到更少的块中,从而增加数据库中的可用空间量。 在创建和更新全局变量时 `IRIS` 通常以将全局块填充到大约 `70%` 容量的方式分配数据。 (完全按整理顺序增长的全局可能会分配到接近 `90%`。)通常,允许 `IRIS` 自动管理全局块密度就足够了。然而,一些不连续的数据删除模式可能会显着降低平均全局块密度。 **注意:要逐个全局地查看数据库中全局块的当前密度,可以运行完整性检查、并检查每个全局的数据级别输出。** 压缩全局变量时,指定所需的全局块密度(默认为 `90%`),操作会尝试通过合并数据来尽可能接近此值——例如,将分布在三个块中的全局数据重新排列为两个。通常(但并非总是),压缩全局变量会显着增加数据库中可用的可用空间。 (如果指定的目标密度低于数据库当前的全局块密度,则数据库的大小不会增加。) 要压缩数据库中的全局变量,请使用以下过程: 1. 打开终端并更改为 `%SYS` 命名空间。 2. 输入 `do ^DATABASE`,然后从菜单中选择 7) `Compact globals in a database`。 ```java %SYS>do ^DATABASE 1) Create a database 2) Edit a database 3) List databases 4) Delete a database 5) Mount a database 6) Dismount a database 7) Compact globals in a database 8) Show free space for a database 9) Show details for a database 10) Recreate a database 11) Manage database encryption 12) Return unused space for a database 13) Compact free space in a database 14) Defragment a database 15) Show background database tasks ``` 3. 指定要在其上运行操作的数据库的目录。可以通过输入来指定多个数据库?在数据库目录压缩`?`提示,然后输入数字列表。 ```java Database directories to compact? ? 1) c:\intersystems\irishealth\mgr\ 2) c:\intersystems\irishealth\mgr\hscustom\ 3) c:\intersystems\irishealth\mgr\hslib\ 4) c:\intersystems\irishealth\mgr\hssys\ 5) c:\intersystems\irishealth\mgr\irisaudit\ 6) c:\intersystems\irishealth\mgr\irislocaldata\ 7) c:\intersystems\irishealth\mgr\iristemp\ 8) c:\intersystems\irishealth\mgr\user\ (Multiple selections allowed: * for all, or list such as 1,4,7-10) ``` 4. 指示您要压缩所有全局变量,或者输入要压缩的单个全局变量列表。 ```java Database directories to compact? 8 c:\intersystems\irishealth\mgr\user\ Databases Selected ------------------ c:\intersystems\irishealth\mgr\user\ ``` 5. 指定目标平均全局块密度,响应其余提示,并确认。 ```java All Globals? Yes => yes 34 items selected from 34 available globals How full do you want the database blocks? 90 => 50 Display compacted globals? No => n Device: "" Right margin: 80 => 50 Confirm compaction of databases? Yes => yes Database Compaction Aug 20 2022 5:49 PM Database c:\intersystems\irishealth\mgr\user\ Global MB Processed MB Compres sed To Completed ------ ------------ ---------- ------ --------- ^IRIS.Msg 0 0 5:49 PM ^IRIS.MsgNames 0 0 5:49 PM ^IRIS.SASchema 0.008 0.008 5:49 PM ^ISC.Src.Jrn 0.008 0.008 5:49 PM ^ISCMethodWhitelist 0.008 0.008 5:49 PM ^ROUTINE 0.008 0.008 5:49 PM ^oddBIND 0 0 5:49 PM ^oddCOM 0.016 0.016 5:49 PM ^oddDEF 0.016 0.016 5:49 PM ^oddDEP 0.008 0.008 5:49 PM ^oddEXT 0.008 0.008 5:49 PM ^oddEXTR 0 0 5:49 PM ^oddMAP 0 0 5:49 PM ^oddMETA 0 0 5:49 PM ^oddPKG 0 0 5:49 PM ^oddPROC 0 0 5:49 PM ^oddPROJECT 0.008 0.008 5:49 PM ^oddSQL 0 0 5:49 PM ^oddStudioDocument 0 0 5:49 PM ^oddStudioMenu 0 0 5:49 PM ^oddTSQL 0 0 5:49 PM ^oddXML 0 0 5:49 PM ^rBACKUP 0 0 5:49 PM ^rINC 0 0 5:49 PM ^rINCSAVE 0 0 5:49 PM ^rINDEX 0.008 0.008 5:49 PM ^rINDEXCLASS 0.008 0.008 5:49 PM ^rINDEXEXT 0.10 0.10 5:49 PM ^rINDEXSQL 0.008 0.008 5:49 PM ^rMAC 0 0 5:49 PM ^rMACSAVE 0 0 5:49 PM ^rMAP 0.008 0.008 5:49 PM ^rOBJ 0.008 0.008 5:49 PM ^rPYC 0.008 0.008 5:49 PM ``` **注意:紧凑的全局操作旨在与正常的数据库活动同时运行。但是,该操作确实会消耗一些系统资源,并且如果系统处于极高负载下,则可能无法完成。出于这些原因, 建议在非高峰时间运行此和其他数据库重组操作(包括压缩数据库和对全局进行碎片整理),并且一次只在系统上运行一个此类操作**。 **全局压缩可能涉及临时增加正在压缩的数据库大小。如果这导致数据库达到其配置的最大大小,或者由于存储卷上的可用空间不足而无法进行扩展,则取消操作。**
文章
Hao Ma · 一月 4, 2023

IRIS, Caché监控指导 - 介绍

本文章是一个系列,主要目的是介绍给IRIS,Caché的终端用户如何方便的监控您的系统。 InterSystems系统的监控很难吗?需要学习很多技术吗? 我的答案是还好。 关于Caché和IRIS监控,无论是那部分内容,在InterSystems的在线文档或者开发者论坛,其实都能找到相关的说明和方案。但问题是太多,太杂乱,没有一个“操作维护手册”的东西。结果是,如果您是一个新手的InterSystems产品的维护工程师或者管理员,您要花很多的时间在大量的文档里找答案。 还有一个问题是文档中很多章节的内容又太深,包含了一些开发人员才关心的内容,这是Caché或者IRIS的特性造成的,因为它首先是一个开发平台。结果是,对于管理员,很多文档的很不友好。 因此,我要写的这个文章的的目的是这样的: - 简单。只介绍管理维护人员需要的内容。只介绍和监控相关的内容。其他比如备份恢复,扩容,修改配置等等基本不涉及。 - 易学。文章的期待读者是系统管理员,因此不需要您有编程能力或者InterSystems编程语言的基础。我系统对您的每个日常工作和关注的主题,给出最容易实现的操作步骤。 - 对读者的要求低,您只需要了解基本的Caché操作,包括 - Caché的用户维护界面 - 操作终端(Terminal)的操作 - 基本的Caché命令的格式 让我们进入主题。有几个要点要先交代一下。 ### InterSystems产品的几个使用的场景 也就是谁在用什么产品 - 场景一:东华的iMedical用户 iMedical 8.5之前的版本使用Caché。 2022年版本8.5发布并开始部署,它的底层是InterSystems IRIS。 - 场景二:独立的InterSystems IRIS实例或者InterSystems HealthShare InterSystems HealthShare是在IRIS平台上面构建的数据共享平台,用于多个医疗机构之间的数据共享,通常会由多个InterSystems IRIS实例组成。本文并不介绍HealthShare的具体技术,您如果是HealthShare的用户,可以通过本文了解单一的IRIS实例的监控。 - 场景三: 医院的集成平台Ensemble用户 从监控维护的角度讲,Ensemble和Health Connect对于医院用户其实是一个东西。Health Connect是最近一些年InterSystems公司对医疗行业使用的Ensemble的一个产品名称。在后面的文章里, 我会只用Ensemble这个名字。 ### 什么是系统监控 简单说,监控工作基本就两块: 1. 监控告警和日志 简单的说,当系统有需要管理员关注的事件发生时,管理员可以及时得到通知。关注的事件通常包括底层的告警,比如CPU占用或者数据库组件出错,或者上层应用的事件,比如一个消息队列太长了。 2. 指标的测量 如果要监控的系统本身有完美的日志和告警通知,那么指标的检测就不那么重要。但实际场景中,用户不仅要检测客户化的上层应用指标,也希望看到底层的指标值,哪怕仅仅是为了展示。 这时候,就需要一个好的指标测量的方案。这里“好的方案”的意思是稳定,易于维护,容易客户定制化的修改。 ### 本文章的组织和您可能感兴趣的内容 如果您是新手,请让我先来强调一下IRIS, Caché和Ensemble的区别 - IRIS, Cache'是开发平台,而不仅仅是数据库。 ​ 举例来说,iMedical的生产环境有很多“应用服务器”,它们是一个个单独部署的Caché实例。它们并不存数据,而仅仅是应用。因此对Caché应用服务器的监控肯定是和数据服务器是不一样的。 - Ensemble是一个应用 Ensemble是在Caché平台上的开发出的消息引擎框架(framework)。它内置了很多用于消息分发传递的组件,用于搭建一个消息引擎。如果只用内置的组件,那么Ensemble几乎可以被看成一个应用。但现实实施中,程序员会使用已有的组件,适配器等开发定制化的组件,这时候Ensemble就是一个开发框架。 无论如何,Ensemble是工作在Cache'或者IRIS之上的,所以Ensemble的维护人员一定要先学维护Cache'或者IRIS。 综上所述, InterSystems产品的监控包括 - IRIS或者Caché的监控(适用于上面所有3个场景的维护人员),包括的内容 - [IRIS,Caché健康检查](./IRIS和Caché健康检查建议.md) - [IRIS,Caché的日志和错误]() - [指标(metrics)的监控] - 数据库性能的监控(适用于场景一,场景二的维护人员) - SQL性能的监控 - 索引的使用情况的监控 - Ensemble的监控(适用于上面场景三的维护人员), 包括 - Ensemble的日志和错误]() - Ensemble的消息统计 除了最基本的监控有关的工作,文章内容里还会包括最基本的和系统健康检查,提交测试报告的内容。也会介绍一些工具,比如SNMP, InterSystems SAM等等。我在工作中了解的一些用户的好的方案,实现等等, 也会和各位分享。 请看下一篇 [IRIS, Caché监控指导(1)-健康检查](https://cn.community.intersystems.com/post/iris-cach%C3%A9%E7%9B%91%E6%8E%A7%E6%8C%87%E5%AF%BC-%E7%B3%BB%E7%BB%9F%E5%81%A5%E5%BA%B7%E6%A3%80%E6%9F%A5)
文章
Claire Zheng · 四月 21, 2021

云助力的集成平台方案

在医院信息化建设中,如何打通医院的各个系统,给患者提供连续、无缝的良好体验,集成平台发挥着重要作用。而集成平台方案如何适应现在的多云时代、需要具备什么样的特性、如何与多云环境更好地结合以便为医院的信息化建设带来更多的便利?面对这一系列问题,InterSystems中国业务拓展经理李岩为您解读InterSystems集成平台方案的特点和优势,以及构建在VMware云方案上的最佳实践,让您了解云环境下集成平台方案的新特性和优势。
公告
Claire Zheng · 五月 19, 2022

5月27日 | 极客俱乐部:集成平台赋能业务流程再造与创新

在集成平台建设如火如荼的今天,如何能最大程度发挥集成平台价值,让集成平台不再止步于业务系统接口的打通,而是真正作为医院的IT基础架构,释放出更大价值?5月27日,InterSystems技术总监乔鹏 ( @Qiao.Peng )和InterSystems销售工程师王菁伟( @Jingwei.Wang )将针对集成平台建成后的应用价值,围绕“业务流程再造”角度,探讨以低代码方式梳理并再造业务闭环流程、从而赋能业务创新并促进医院精细化管理和高质量发展。点击链接或扫描报名。
公告
Claire Zheng · 六月 14, 2023

2023 年 6 月 13 日 - 公告:进程内存使用量增加

InterSystems 已纠正导致进程内存使用量增加的缺陷。 具体来说,在对局部变量执行$Order 、 $Query 或 Merge时,会出现本地进程分区内存消耗增加的问题。虽然这对大多数运行环境没有不利影响,但支持大量进程或严格限制每个进程最大内存使用的环境可能会受到影响。某些进程可能会遇到<STORE> 错误。 该缺陷存在于2023.1.0.229.0中,但它被重新发布为2023.1.0.235.1,并包含了修复程序,以加快修正,而无需客户等待维护版本。 此缺陷的更正标识为 DP-423127 和 DP-423237。这些将包含在所有未来版本中。 该缺陷出现在 InterSystems IRIS ® 、InterSystems IRIS for Health ™ 和HealthShare ® Health Connect 的版本 2022.2、2022.3 和 2023.1(内部版本 229)中。如果您运行的是这些版本之一,我们建议升级到 2023.1(内部版本 235)。 此修复也可通过 Ad hoc 分发获得。 如果您对此警报有任何疑问,请联系全球响应中心。
文章
Qiao Peng · 三月 29, 2021

CDC系列之二 :使用Dejournaling filter routine在Caché上通过Shadow实现CDC

Caché Shadow 上次介绍了使用InterSystems IRIS/Caché的Reporting类型的异步镜像成员获取数据变更。但早期的Caché并不支持镜像,例如Caché 2008,它只支持Shadow。 在这些早期版本上是否也可以实利用Journal实现类似CDC的功能呢?答案是肯定的,就是利用Shadow服务器的Dejournaling filter routine (Dejournaling过滤器routine)。 Dejournaling filter routine InterSystems Caché的 Dejournaling过滤器routine是一个用户自定义的routine,用于在Shadow服务器上过滤Journal记录。当配置了Dejournaling 过滤器后,Shadow服务器在redo journal前会自动调用Dejournaling过滤器routine。该routine传入参数以下: pid:记录进程ID; dir:源数据库目录; glo:Global节点(包括下标); type: 操作类型,为S (Set)、K (Kill)、s (BITSET)、k (ZKILL); addr:Journal记录在Journal文件中的偏移量; time:记录的时间戳。 该Routine返回1,说明此journal记录需要被Shadow恢复,而返回0说明此journal记录不需要被Shadow恢复。 因为这是一个自定义routine,且会被Shadow服务器恢复Journal时自动调用,因此我们可以利用它记录数据变更。 注意: Shadow配置不在本文内容里,请参考文档: [Caché] https://cedocs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GCDI_shadow 编写Dejournaling filter routine Routine的名字可以任意,但这个routine需要保存在Caché Shadow服务器的%SYS下。 例如,将global的数据变更记录在^CDCLog中: MyShadowFilter(pid,dir,glo,type,addr,time) { Set ^CDCLog($I(^CDCLog))=$lb(dir,glo,type,addr) Quit 1 } 配置Dejournaling filter routine 在 Caché Shadow服务器的系统管理门户的[Home] > [Configuration] > [Shadow Server Settings] 上选择已经建立好的Shadow服务器,选择高级(Advanced)设置,在Filter routine里填写上面创建的routine名称即可。 CDC系列 更多的CDC选项实现,请参考: 1. CDC系列之一 :使用Dejournal Filter在InterSystems IRIS/Caché上通过Mirroring实现CDC功能 2. CDC系列之二 :使用Dejournaling filter routine在Caché上通过Shadow实现CDC 3. CDC系列之三 :建立InterSystems IRIS/Caché的Global数据变更与SQL表记录的对应关系 4. CDC系列之四:使用DSTIME特性在InterSystems IRIS/Caché上实现CDC功能
公告
Claire Zheng · 四月 22, 2021

InterSystems开发者工具编程大赛投票时间:为你心目中的最佳App投票吧!

亲爱的社区开发者们: 本周进入 InterSystems 开发者工具编程大赛 投票时间(4月19日-25日)! 来为你心目中基于InterSystems IRIS而构建的最佳方案投票吧! 🔥 投票入口: 点击投票 🔥 如何投票?有哪些最新信息值得了解一下? 所有的InterSystems员工均可为专家提名奖(Experts Nomination)或社区提名奖(Community Nomination)投票。 所有社区开发者都可以为自己提交的项目投票——投票将根据用户的Global Master级别自动计入专家提名奖(Experts Nomination)和社区提名奖(Community Nomination)。 根据目前的投票引擎和算法,您可以选择三个项目进行投票,选出您心目中的一、二、三名。以下是社区排行榜说明: 社区(Community)提名投票计分方式 如果您满足以下条件 提名 第一名 第二名 第三名 如果您在DC上发布过帖子,且在Open Exchange上传过App 9 6 3 如果您在社区发布过至少一篇帖子,或者在Open Exchange上传过至少一个App 6 4 2 如果您在社区进行过有效贡献(包括发表评论/提问等等) 3 2 1 专家(Experts)提名投票计分会有更复杂的数学计算,不同级别的专家有更多的“点数”权力: 专家(Experts)提名投票计分方式 级别 提名 第一名 第二名 第三名 Global Maters VIP级 & InterSystems产品经理 15 10 5 Global Master 大使级(Ambassador) 12 8 4 Global Master专家级(Expert)& 社区管理员/版主 9 6 3 Global Master专业级(Specialist) 6 4 2 Global Master初级倡导员(Advocate)& InterSystems员工 3 2 1 系统会根据您的级别,对社区(Community)提名和专家(Experts)提名分别自动计票。 请看投票演示(请注意您提名项目的分数变化): 为了顺利参加投票,您需要: 登录 Open Exchange – 利用开发者社区账号即可 确保您在开发者社区进行过有效贡献——回答问题、提问、发帖、在Open Exchange上传应用程序——然后您就可以进行投票了。 点击了解如何成为社区“活跃”用户 。 如果您改变了主意,可以取消并投票给其他您看中的应用——您有充分的时间选择(4月19日-25日)! 提醒:在投票期间,参赛者可以继续修复bug,提升应用,所以投票者不要错过最新发布的版本哦~ ➡️ 点击查看最新 InterSystems在线竞赛投票规则.
文章
Weiwei Gu · 九月 28, 2022

使用嵌入式Python生成数据流

Hi Developers, 嗨,各位开发者们: 各位都知道,Python是一个庞大而强大的生态系统,包含了成千上万的库和包,特别是在数据科学方面。 因此,我想首次尝试使用IRIS最近的一项功能--嵌入式Python,简单地导入一个名为datetime的Python库,生成带有时间戳成分的数据,并在InterSystems IRIS for Health Data Platform中持久化。同样的方法在IRIS数据平台上也可以使用。 我把这个小项目分成了两个主要部分。 *按照IRIS for Health Data Platform的文档设置嵌入式Python环境*使用嵌入式Python创建时间戳数据作为例子,并使用datetime包持久化到IRIS。 1. 在 InterSystems IRIS for Health Data Platform 2022.1 上设置嵌入式 Python。 在Windows上,打开CMD terminal C:\InterSystems\IRISHealth\bin>irispip install --target C:\InterSystems\IRISHealth\mgr\python numpy 注意:这是检查嵌入式Python环境的步骤,因为我发现当我使用IRIS 2021.0时,irispip经常不工作。 通过导入一个Python math packge来测试Python功能 打开IRIS终端,在USER命名空间中执行以下程序:set pymath = ##class(%SYS.Python).Import("math") 然后执行write pymath.pi,你可以看到你已经成功调用了Python包,输出结果如下。 USER>write pymath.pi 3.141592653589793116 而我们也可以通过从IRIS terminal打开来启动Python shell。 do ##class(%SYS.Python).Shell() Class User.PythonFirstTry Extends %RegisteredObject{ClassMethod pyHello() As %Status{ set pythonBuiltins = ##class(%SYS.Python).Builtins() do pythonBuiltins.print("Hello World!")}ClassMethod pyForLoop() [ Language = python ]{ for i in range(5): print("Python")}} 我写了两个类方法,你可以试着把它们放在一个.cls文件中,编译一下,看看输出。 执行方法如下: USER>do ##class(User.PythonFirstTry).pyHello() Hello World! USER>do ##class(User. PythonFirstTry).pyForLoop() Python Python Python Python Python 2. 使用python库来生成数据流并持久化到InterSystems IRIS中。 生成数据流所需的Python库: 导入datetime包(这不需要使用CLI进行额外的安装)。除了datetime包,我还尝试使用了其他的库和包,但是其中一些并不在Embedded Python中。要安装这些东西,请打开 CMD terminal (Windows),然后运行以下程序 (XX 将被替换成包的名称)。 C:\InterSystems\IRISHealth\bin>irispip install XX 以下是生成数据并持久化到IRIS的步骤: 1.创建 %Persistent类 2. 创建Property3.设置一个类方法(例如:GetData)并指定[Language = python] 。4.通过调用datetime python库生成数据,使用以下代码片段 注意:timeNow需要被转换为字符串数据类型 5.通过IRIS terminal 执行GetData()方法,执行SQL查询 注意:你可以使用一种简单的 "For " 循环来控制这种方式产生的数据量的规模。 感谢翻译!! @Weiwei.Gu
文章
Michael Lei · 五月 16, 2021

将普通 ObjectScript 持久化类暴露为 FHIR 代码系统和值集

[FHIR 术语服务](https://www.hl7.org/fhir/R4/terminology-service.html)规范描述了一组对 [CodeSystem](https://www.hl7.org/fhir/R4/codesystem.html)、[ValueSet](https://www.hl7.org/fhir/R4/valueset.html) 和 [ConceptMap](https://www.hl7.org/fhir/R4/conceptmap.html) 资源的操作。 在这些操作中,以下四种操作似乎是最为广泛采用的: | CodeSystem | ValueSet | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [$lookup](https://www.hl7.org/fhir/R4/codesystem-operation-lookup.html)[$validate-code](https://www.hl7.org/fhir/R4/codesystem-operation-validate-code.html) | [$expand](https://www.hl7.org/fhir/R4/valueset-operation-expand.html)[$validate-code](https://www.hl7.org/fhir/R4/valueset-operation-validate-code.html) | 开发该规范的部分实现一直是探索 IRIS for Health 2020.1 中引入的[全新 FHIR 框架](https://docs.intersystems.com/irisforhealth20203/csp/docbook/Doc.View.cls?KEY=HXFHIR_server_intro#HXFHIR_server_arch)的有效途径。 本[实现](https://github.com/intersystems-ru/fhir-terminology-service)包括上述四种操作,并支持与 [CodeSystem](https://www.hl7.org/fhir/R4/codesystem.html) 和 [ValueSet](https://www.hl7.org/fhir/R4/valueset.html) 资源的[读取](https://www.hl7.org/fhir/R4/http.html#read)和[搜索](https://www.hl7.org/fhir/R4/http.html#search)交互。 需要注意的是,本实现使用普通 ObjectScript 持久化类作为源术语表。 ### 安装和测试示例策略 下面列出了安装和基本测试步骤: 1. 安装 IRIS for Health 2020.1 或更新版本。 2. 使用门户的 `System Administration` > `Configuration` > `System Configuration` > `Namespaces` 菜单或在 HSLIB 命名空间中运行命令 `do ##class(HS.HC.Util.Installer).InstallFoundation("")` 来建立一个新的命名空间。 然后从 [intersystems-ru/fhir-terminology-service](https://github.com/intersystems-ru/fhir-terminology-service) GitHub 仓库的 [src/cls](https://github.com/intersystems-ru/fhir-terminology-service/tree/main/src/cls/) 和 [samples/cls](https://github.com/intersystems-ru/fhir-terminology-service/tree/main/samples/cls/) 文件夹导入类。 3. 基于 R4 数据集以及在 [dummy-search-parameters.json](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/src/fhir-search-parameters/dummy-search-parameters.json) 中定义的附加搜索参数,创建一个自定义 FHIR 元数据集。 这可以使用 `##class(HS.FHIRServer.ConsoleSetup).Setup()` 交互实用工具或运行以下命令来完成: ``` do ##class(HS.FHIRServer.Installer).InstallMetadataSet("", "", "HL7v40", $lb(""), 1) ``` * 为了使 `$expand` 和 `$validate-code` 操作支持 HTTP GET 请求,此步骤是必需的。 * 请注意,与 InterSystems IRIS 一起打包的 FHIR 元数据集文件位于 `/dev/fhir/fhir-metadata` 目录中。 4. 基于新的元数据集和 [Sample.iscru.fhir.fts.SimpleStrategy](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/samples/cls/Sample/iscru/fhir/fts/SimpleStrategy.cls) 类创建一个新的 FHIR 端点。 同样,这可以使用交互实用工具或运行以下命令来实现: ``` do ##class(HS.FHIRServer.Installer).InstallInstance("", "Sample.iscru.fhir.fts.SimpleStrategy", "") ``` 5. 允许对新端点进行未经身份验证的访问:使用交互实用工具或运行以下[命令](https://docs.intersystems.com/irisforhealth20203/csp/docbook/Doc.View.cls?KEY=HXFHIR_server_install#HXFHIR_server_install_program_configure): ``` set strategy = ##class(HS.FHIRServer.API.InteractionsStrategy).GetStrategyForEndpoint("") set config = strategy.GetServiceConfigData() set config.DebugMode = 4 do strategy.SaveServiceConfigData(config) ``` 6. 填充 [Sample.iscru.fhir.fts.model.CodeTable](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/samples/cls/Sample/iscru/fhir/fts/model/CodeTable.cls): ``` do ##class(Sample.iscru.fhir.fts.model.CodeTable).Populate(10) ``` 7. 将 [fhir-terminology-service.postman_collection.json](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/tests/postman/fhir-terminology-service.postman_collection.json) 文件导入到 Postman 中,调整集合内定义的 `url` 变量,然后针对 `Sample.iscru.fhir.fts.model.CodeTable`(一个简单的持久化类)测试服务。 ### 支持的 FHIR 交互 目前 CodeSystem 和 ValueSet 都支持的唯一搜索参数是 `url`。 上述四种操作均支持 HTTP GET 和 HTTP POST 方法。 下表列出了一些针对 [Sample.iscru.fhir.fts.model.CodeTable](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/samples/cls/Sample/iscru/fhir/fts/model/CodeTable.cls) 类的可能 HTTP GET 请求。 | URI(前面加上 `http://:`) | 描述 | | ---------------------------------------------------------------------------- | ------------------------------------------------------------- | | /metadata | 获取端点的能力描述资源。 | | /CodeSystem/Sample.iscru.fhir.fts.model.CodeTable | 读取与 Sample.iscru.fhir.fts.model.CodeTable 类对应的 CodeSystem 资源。 | | /ValueSet/Sample.iscru.fhir.fts.model.CodeTable | 读取与 Sample.iscru.fhir.fts.model.CodeTable 类对应的 ValueSet 资源。 | | /CodeSystem?url=urn:CodeSystem:CodeTable | 通过 url 搜索 CodeSystem 资源。 | | /CodeSystem | 输出所有可用 CodeSystem 资源。 | | /ValueSet?url=urn:ValueSet:CodeTable | 通过 url 搜索 ValueSet 资源。 | | /ValueSet | 输出所有可用 ValueSet 资源。 | | /CodeSystem/$lookup?system=urn:CodeSystem:CodeTable&code=TEST | 在给定系统和代码的情况下,获取有关该概念的所有详细信息。 | | /ValueSet/$expand?url=urn:ValueSet:CodeTable | 展开 ValueSet。 | | /CodeSystem/Sample.iscru.fhir.fts.model.CodeTable/$validate-code?code=TEST | 验证某个代码是否在代码系统中。 | ### 创建自定义策略 为了将您自己的持久化类公开为 FHIR 代码系统/值集,您需要创建自定义策略类,方法是先将 [iscru.fhir.fts.FTSStrategy](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/src/cls/iscru/fhir/fts/FTSStrategy.cls) 子类化,然后基于新的自定义策略创建 FHIR 端点(请参见上面的安装步骤 4)。 您的策略类必须覆盖一个类参数和至少三个方法: * `StrategyKey` 类参数应该被指定一个唯一值。 当前类的名称似乎是一个好选择。 * `getCodeTablePackage()` 类方法应该返回通过[规范 URL](https://www.hl7.org/fhir/R4/resource.html#canonical) 标识的给定代码系统(或值集)的包名称。 通常,所有术语类都属于一个包,因此该方法通常会返回一个相同的包名称,不管参数值如何。 * `getCodePropertyName()` 和 `getDisplayPropertyName()` 类方法应该返回与 `code` 和 `display` 概念元素对应的类属性的名称。 不同的类可能有不同的属性映射到术语 code/display 元素。 [iscru.fhir.fts.FTSStrategy](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/src/cls/iscru/fhir/fts/FTSStrategy.cls) 的其他可能适合覆盖的方法和参数如下: * `listCodeTableClasses()` 类方法需要覆盖,才能支持以返回所有可用代码系统(或值集)为结果的搜索请求。 此方法应该返回所有可用术语类的类名称列表。 [Sample.iscru.fhir.fts.SimpleStrategy](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/samples/cls/Sample/iscru/fhir/fts/SimpleStrategy.cls) 包含此方法的以下基本实现: ``` /// Returns a list of all available code table classes. ClassMethod listCodeTableClasses() As %List { #dim sql As %String = "SELECT name FROM %Dictionary.ClassDefinition WHERE name LIKE '" _ ..#codeTablePACKAGE _ ".%' ORDER BY name" #dim resultSet As %SQL.StatementResult = ##class(%SQL.Statement).%ExecDirect(, sql) if (resultSet.%SQLCODE '= 0) && (resultSet.%SQLCODE '= 100) $$$ThrowStatus($$$ERROR($$$SQLError, resultSet.%SQLCODE, resultSet.%Message)) #dim return As %List = "" while resultSet.%Next() { set return = return _ $lb(resultSet.name) } quit return } ``` * 如果您的持久化类的任何特定属性都不应出现在 CodeSystem 资源中,则需要覆盖 `isExcludedProperty()` 类方法。 默认情况下,此方法会过滤掉 `Collection`、`Identity`、`Internal`、`MultiDimensional` 和 `Private` 属性。 需要注意的是,对象引用和流属性当前不受框架支持并被忽略。 * `codeSystemUrlPREFIX` 和 `valueSetUrlPREFIX` 类参数以及 `getCodeSystemForClassname()`、`getValueSetForClassname()`、`determineCodeTableClassname()` 和 `determineCodeSystemForValueSet()` 方法控制类名称与[规范 URL](https://www.hl7.org/fhir/R4/resource.html#canonical) 相互映射的方式。 默认情况下,对规范 URL 使用以下命名方案: | CodeSystem | ValueSet | | ----------------------------------------- | --------------------------------------- | | `urn:CodeSystem:` | `urn:ValueSet:` | 请注意,CodeSystem/ValueSet 资源的[逻辑 id](https://www.hl7.org/fhir/R4/resource.html#id)(也就是服务器 id)等于其对应类的全名。 ### 待完成功能 目前缺少的是对代码系统版本管理、概念层次结构和 `$subsumes` 操作、ConceptMap 资源以及其他许多内容的支持。 欢迎发表意见和拉取请求!
文章
Botai Zhang · 一月 26, 2021

利用Intersystems IRIS医疗版数据平台内置多模型整合医院信息查询业务解决方案

利用Intersystems IRIS医疗版数据平台内置多模型整合 医院信息查询业务解决方案 概述: 随着医院信息化建设的逐步完善,医院子系统越来越多,系统间接口越来越多,同时接口费用不断增加,管理工作变得越来越复杂。其中,查询类业务接口根据业务类型分化,数量也是逐步递增,带来接口量大、开发工作繁重、代码冗余、维护困难等等问题。针对这一困境,我们利用Intersystems IRIS数据平台内置多模型整合医院信息查询业务解决方案。该应用程序可通过内置模型应用完成查询业务,大大缩小开发、维护、实施等项目关键运转周期。 应用链接:HealthInfoQueryLayer 关键应用:IRIS for Health、REST API、ObjectScript、Globals 、SQL、DATA LOOKUP TABLES 应用程序采用模型及应用介绍: 1.采用模型 1.1. Globals (key-value) Globals是可以在IRIS数据库中存储和管理的稀疏多维数组。您可以使用ObjectScript和本机API处理Globals。 工具: https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GGBL_MANAGING 应用: 应用程序根据Globals的键值对、访问速度快的特性。应用在本次程序的Rest分派类与BP流程管理中取值应用,解决了频繁取值速度慢、实现在查找表前端页面配置操作,如:存储了SQL模型、服务配置信息等等。 1.2. SQL访问 InterSystems IRIS通过 ObjectScript、REST API及JDBC提供对数据的SQL访问. 工具: https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=GSQL_smp 应用: 在查询业务中,三方系统不配合接口改造,导致接口实现困难问题。此时,我们采用IRIS内嵌模型ObjectScript、REST API及JDBC来实现对数据的SQL访问,来建立业务接口。 1.3. Object访问 通过ObjectScript、REST API,InterSystems IRIS提供了在Globals 存储和更改对象实例的途径。 文档: https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=PAGE_multimodel_object 应用: 在整个交互过程中,直接操纵InterSystems IRIS对象。ObjectScript类定义通常用作创建对象(例如患者,科室或医护人员)的模板。 建立应用案例(此应用程序以患者为例) 2.1应用搭建: 2.1.2基本环境 IRIS版本信息:IRIS for Windows (x86-64) 2020.1 (Build 215U) Mon Mar 30 2020 20:14:33 EDT [HealthConnect:2.1.0] IRIS具有JAVA、JDBC环境 可采用PostMan进行测试 2.1.2安装步骤 ①建立Rest服务 新建Web应用程序→配置分派类→配置权限。 该步骤可见图片:应用程序运行情况/webaplication(Query).png及webaplication(role).png ②配置SQL-JDBC 建立SQL连接,连接测试数据库Mysql,导入测试jhip_patient_info.sql ③配置查找表 Global-^Ens.LookupTable中查找表文件导入 ④导入代码 导入ApplicationCode中的代码,编译,打开Production, 注意:修改BO配置信息(DNS)、配置JavaGateway等 2.2应用流程 2.3应用测试 可采用Postman工具(其他工具也可以)进行测试验证 Postman可导入Query.postman_collection.json,更改IP、端口号信息、URL进行测试。 2.4应用总结 本应用程序以查询患者为案例,采用IRIS中REST API、ObjectScript、Globals 、SQL内置多种模型实现医院信息查询业务。如果有需要可根据此方案丰富业务满足需求。 最后,如果您认可此解决方案,请在系统间多模型数据库竞赛中为该应用程序投票。 投票链接:投票链接 应用程序名称:HealthInfoQueryLayer 点击Vote投票即可。 感谢各位! 集成平台应用典型案例 感谢您的分享
文章
Claire Zheng · 八月 17, 2021

FHIR标准和国际基于FHIR的互联互通实践(5):FHIR以及InterSystems FHIR参考架构

FHIR是快速医疗互操作资源(Fast Healthcare Interoperability Resources)的缩写,所以FHIR的核心是资源模型。它的颗粒度和结构都优于之前的V2 、V3、CDA标准,而且能够灵活扩展。另外一个优势就是它的API,它不仅提供了针对于资源模型本身的原子化的CRUD(创建、读取、更新、删除的这样一些原子化操作),而且提供了查询这种更复杂操作的能力,同样API是可以扩展的。 此外,之前的互操作标准基本上都不会涉及到数据的保存,而FHIR资源仓库提供了一个全新的架构、全新的思路来使用FHIR,实现这种互操作。 这是InterSystems公司FHIR的参考架构,处于核心的就是FHIR服务器,它向外提供API的接口能力,包括FHIR的事务、FHIR的各种交互跟FHIR操作,底层是FHIR资源仓库,它可以持久化所有的FHIR资源,同时允许FHIR服务器对FHIR资源进行事务性的操作,所有需要使用FHIR API的客户端都可以使用FHIR服务器发布出来的API来进行相应的操作与访问。 上文我们讲到有常见的4种互操作的方式,HL7 FHIR支持所有的这些方式,而且它提供了第5种互操作方式。 首先,通过RESTful API它能够提供一个更紧密的业务集成度、去中心化的互操作能力,比较适合于搭建医疗微服务业务环境,同时比较适合于像云、互联网、物联网这种有紧密业务集成需求的环境。 另外FHIR依然支持以消息、文档方式来进行使用。这两种使用方式兼顾了传统互操作的模式,主要的目标是解决低业务集成度和跨数据管理域的集成和交换需求。 FHIR也可以基于服务来提供这种互操作,例如IHE已经有了大量的场景规范基于FHIR来实现了。 第五种就是我们说的资源仓库。大家可能会觉得奇怪,它怎么会成为一种互操作的方式? 我们先来看看互联互操作需求的起源:上图是比较传统的三层架构的开发模式,从底层的数据模型进行设计,到业务逻辑层,再到用户界面层,创造的是烟囱一样的应用。这种烟囱应用之间就需要通过互操作来打通,实现信息的共享和交换。 假设建设的不是烟囱类型的应用,我们还需要基于消息、文档的交换吗? 来看看生物界。世界上最大的生物是一种巨大的菌丝,在美国的俄勒冈州的蓝山有一种蜜真菌,它被科学家认为这是世界上最大的生物。地下的菌丝是一个整体,连在一起的,看起来独立的一个个蘑菇,其实都是这个巨大生命体的一部分。科学家估计在蓝山的蜜真菌的面积能够达到9.6平方公里,年龄已经差不多1900岁,甚至有人说可能在6500岁之间。 如果说我们把FHIR的资源仓库视为菌丝,基于FHIR资源仓库开发的应用,就是一个个的小蘑菇,它们只需要关注用户界面和业务逻辑,因为它们所有的数据存储和数据访问能力都是由标准的FHIR服务器提供的,而FHIR服务器下面可以接非常多的FHIR资源仓库,也就说资源仓库可以不止一个。这就是虚拟的集中式架构,在虚拟集中式的架构下的所有应用天生就是互联互通的,这就是FHIR的第5种互操作模式。 大家可能会问真有人这么做吗?还真有——SMART on FHIR就是比较典型的这种应用方式。 SMART是 “可替代医疗应用的、可重复使用技术”的缩写,它起初是哈佛医学院跟波士顿儿童医院在2011年开启的一个项目,它这个项目目标是用来创建这种可复用、可替代的应用开发架构。显然FHIR提供的这种标准化的数据模型和API是SMART能够实现的基础——的确是,在2014年SMART 跟 FHIR融合出来一个新的项目就是今天的SMART on FHIR。这个应用程序开发的架构使用标准的FHIR资源模型,使用标准的FHIR API来操作资源数据,使用OAuth2 和OpenID实现统一的认证授权,而开发者只需要关注在业务逻辑和应用层面。它开发出来的SMART应用底层的数据都保存在FHIR服务器和FHIR资源仓库里面,这些应用跟我们的手机的APP一样,都是即插即用的。这些即插即用的应用可以在所有支持 FHIR的服务器和FHIR资源仓库上实现,而且可以复用。 这些应用程序里面并不保存数据,我们不用担心数据跟应用共存亡的问题,因此这些应用其实可以随时被替代。如果你觉得它不好,有一个更好的应用你觉得喜欢,就直接把旧的扔了,插一个新的应用就ok了,这种建设的应用天生就是互联互通的。 注:本文根据InterSystems中国技术总监乔鹏演讲整理而成。