第十一章 创建Callout Library - 使用 J 链接类型传递标准计数字符串
使用 J 链接类型传递标准计数字符串
iris-callin.h 头文件定义了计数字符串结构 IRIS_EXSTR,表示标准 IRIS 字符串。
InterSystems IRIS for Health™ 是全球第一个也是唯一一个专门为医疗应用程序的快速开发而设计的数据平台,用于管理全世界最重要的数据。它包括强大的开箱即用的功能:事务处理和分析、可扩展的医疗保健数据模型、基于 FHIR 的解决方案开发、对医疗保健互操作性标准的支持等等。所有这些将使开发者能够快速实现价值并构建具有突破性的应用程序。了解更多信息。
J 链接类型传递标准计数字符串iris-callin.h 头文件定义了计数字符串结构 IRIS_EXSTR,表示标准 IRIS 字符串。
我们继续推出有关可供 HealthShare HealthConnect 和 InterSystems IRIS 用户使用的 FHIR 适配器工具的系列文章。
在前几篇文章中,我们介绍了小型应用程序,并在此基础上建立了我们的工作,并展示了安装 FHIR 适配器后在 IRIS 实例中部署的架构。在今天的文章中,我们将看到一个示例,说明如何执行最常见的 CRUD(创建 - 读取 - 更新 - 删除)操作之一,即读取操作,我们将通过恢复资源来完成此操作。
FHIR 中的一个资源对应一种相关的临床信息,这种信息可以是病人(Patient)、对实验室的请求(ServiceRequest)或诊断(Condition)等。每种资源都定义了组成它的数据类型,以及对数据的限制和与其他类型资源的关系。每个资源都允许对其包含的信息进行扩展,从而满足 FHIR 80% 以外的需求(满足 80% 以上用户的需求)。
在本文的示例中,我们将使用最常见的资源 "Patient"。
在医疗行业中,处方是个非常重要的临床工作数据概念。因此,在考察用FHIR能如何构造我国所需医疗行业数据模型时,就会需要考虑如何用FHIR表达处方。
在2019年,FHIR的工作组已否认需要使用特定的资源来表达处方(不是药嘱)这个概念,见:
https://jira.hl7.org/browse/FHIR-24905

奇妙的是,IHE规范中却明确有处方(Prescription)的定义并需要引用药嘱(Medication Treatment Plan Item)。
https://www.ihe.net/uploadedFiles/Documents/Pharmacy/IHE_Pharmacy_Suppl_PRE.pdf?#page=12
FHIR官网指出这种复合式的request有三种表达方式:
• Shared requisition id
• "Based on" chain
• RequestOrchestration
在FHIR实际应用中,则可以见到多种形态使用容器类资源表达处方并包含药嘱的表达形式,例如:
http://wiki.hl7.org.cn:81/static/fhir-2023/spec-specialty-rx.html
Callout library 库是一个共享库,其中包含自定义Callout函数和允许 IRIS使用它们的启用代码。本章描述如何创建库并在运行时访问它。
Callout library 简介-描述如何创建和访问Callout library 。ZFEntry链接选项 - 提供了决定如何传递函数参数的链接选项的详细描述。注:共享库和标注库的术语,共享库是指动态链接的文件(上的DLL文件或及相关操作系统上的文件)。是一个共享库,它包含到接口的钩子,允许各种函数在运行时加载和访问它。
从代码访问Callout库有几种不同的方法,但一般原则是指定库名、函数名和任何必需的参数(请参阅“调用库函数”)。例如,下面的代码调用一个简单的库函数:
从库调用函数
下面的代码在终端上执行。它加载一个名为的库,并调用一个名为的库函数,该函数将两个整数参数相加并返回总和。
库并不比调用它的代码复杂多少。它包含所有 库所需的三个元素:
iris-cdzf.h Callout 头文件时提供的标准代码。%System_Callout:USE权限$ZF(-100)需要%System_Callout:USE权限。如果安全设置高于最小值,则可能会禁用此特权。下面的过程描述了如何在%Developer角色中启用它:
Roles页面上,单击Names列中的。%System_Callout权限并单击角色总是在安装 IRIS时创建,但是管理员可能不希望所有用户都可以使用它。在某些情况下,可能需要为用户提供一个角色,使可用,但不授予任何其他特权。下面的过程创建了一个只授予权限的新角色:
打开Management Portal,进入System Administration > Security > Roles。
在页面上,单击按钮以调出页面。
填写姓名和描述:
Name: UseCalloutdescription:授予使用%System_CallOut资源的权限单击时,表单上将出现一个按钮。
单击Add
$ZF(-100)函数允许 IRIS 进程调用可执行程序或主机操作系统的命令。这是唯一可以在没有特殊的Callout共享库的情况下使用的函数。
$ZF(-100)的语法和功能概述。I/O。%System_Callout:USE特权—使用$ZF(-100)需要此特权。注意:$ZF(-100)取代了已弃用的函数和,在所有情况下都应优先使用。
提供类似于命令行接口的功能,允许调用可执行程序或主机操作系统的命令。这个函数的语法是:
第一个参数必须是字面量。其他三个参数指定以下信息:
Command - 指定要调用的程序或系统命令的字符串。如果未指定可执行文件的完整路径,则操作系统将应用标准搜索路径规则。函数返回由操作系统和被调用的程序确定的退出状态码。
下面的示例将三个字符串传递给命令,然后显示状态码。这个例子没有使用关键字,所以关键字参数是一个空字符串。最后一个命令参数指定一个带引号的字符串(遵循标准的
IRIS $ZF系统功能是一套相关功能的容器。$ZF套件中的大多数函数都由函数调用的第一个参数标识,该参数将是一个负数,-100或到。例如,调用操作系统命令的函数具有的形式,其中是包含要执行的命令的字符串。当讨论这个函数时,它将被称为。以同样的方式,其他函数将被称为$ZF(-3)到,只使用实际函数调用的第一个参数。也可以在不带负数参数的情况下调用函数,在这种情况下,它调用名为的特殊库中的函数。
注:是动态链接的文件(为DLL文件,及相关操作系统为文件)。库是一个共享库,它包含到接口的钩子,允许各种函数在运行时加载它并调用库函数。
函数集包括以下接口:
主要的$ZF()函数提供了对来自名为iriszf的特殊库的函数的直接访问。当定义并编译了这个自定义库后,只需指定函数名和参数(例如,,就可以调用它的函数。与、或不同,不需要加载库或指定库标识符。
函数用于运行shell命令和操作系统服务调用。它不用于访问库,可以在没有任何先前设置的情况下调用。
函数是一种加载库并使用一条语句调用库函数的简单方法。库及其函数都是通过名称指定的,并且库保留在内存中,直到被对另一个库的调用所替换。
函数为和提供了一组服务。它是由前两个参数(到)标识的八个效用函数的容器。
Topic |
Parameters |
|---|---|
启用 XML 映射。 |
类参数 |
| 将属性映射到元素或属性。 | XMLPROJECTION property parameter ("NONE", "ATTRIBUTE", "XMLATTRIBUTE", "CONTENT", "ELEMENT", or "WRAPPED")XMLDEFAULTREFERENCE class parameter ("SUMMARY", "COMPLETE", "ID", "OID", or "GUID")XMLREFERENCE property parameter ("SUMMARY", "COMPLETE", "ID", "OID", or "GUID") |
| 元素名称和属性名称。 | XMLKEYNAME property parameter默认值基于 类型名称。 |
| 类型 | XMLTYPE class parameter |
| 命名空间 | NAMESPACE class parameterYou can override this upon export. |
由于源 XML 文档可能包含意外的元素和属性,因此支持 XML 的类提供两个参数来指定导入此类文档时如何反应。例如,考虑以下类定义:
Class GXML.TestImportParms.Person Extends (%Persistent,%XML.Adaptor)
{
Property Name As %Name [ Required ];
Property DOB As %Date(FORMAT = 5, MAXVAL = "+$h") [ Required ];
}
另请考虑以下 文档:
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Person employeeID="450">
<Name>Dillard, Daniel</Name>
<DOB>1962-09-18</DOB>
<UserID>fr0078</UserID>
<Address>
<Street>810 Main Street</Street>
<City>Reston</City>
<State>NJ</State>
<Zip>02641</Zip>
</Address>
</Person>
</Root>
当在顶层映射 IRIS 对象(而不是作为另一个对象的属性)时,其内部 ID、OID 和全局唯一 不能用作对象属性,因此不会映射这些 。但是,在某些情况下,可能希望使用对象 作为唯一标识符。然后,例如,可以在更新存储的对象之前将传入(已更改)的对象与相应的存储对象进行匹配。
支持提供了多个帮助程序类,可用于将 对象标识符投影到 XML 文档: 中(对于内部 ID)、(对于 ``)和 (用于全局唯一 )。
要使用这些类,请向支持 的类添加一个特殊属性,该属性的用途是包含要导出的 。该属性的类型必须为 %XML.Id、或 。确保该属性已映射,并将其标记为瞬态,以便它不包含在该类的 映射中。
当导出到 时,将支持 的类的对象带入内存。当对象位于内存中时,添加的特殊属性将从 IRIS 内部存储中检索请求的 并包含该值(以便您可以导出它)。
例如,考虑以下类:
Class MyApp4.Obj.Person4 Extends (%Persistent,%Populate,%XML.Adaptor)
{
Property IdForExport As %XML.Id
(XMLNAME="IRISID", XMLPROJECTION="ELEMENT") [Private, Transient];
Property Name As %Name;
Property DOB As %Date(FORMAT = 5, MAXVAL = "+$h");
}
最近在多家现场都遇到了备机长时间宕机导致镜像日志写满磁盘的问题。在这里我将对这个问题发生的原因、发生后的处理、和如何预防这类问题发生进行一些讨论。
问题的发生一般始于一些原因导致的主机(如,01)宕机,进而触发镜像的主备切换。切换后备机(如,02)成为主机,并无缝接管业务。由于业务不受影响,如果不注意监控环境的话,很可能现场技术人员长时间都注意不到镜像的备机(01)是宕机状态。
备机长时间宕机会导致如下问题:
1. 这种情况下如果主机(02)再次遇到问题宕机,镜像将无法发挥其高可用性,无法保持业务稳定运行。
2. 主机(02)产生的镜像日志将无法同步到备机(01)。未同步的日志将一直被保存在主机(02)上不被删除。长此以往镜像日志磁盘将被写满,同样导致主机(02)宕机。
问题发现时切记不要手动从文件夹直接删除主机(02)上的镜像日志。未同步的日志一旦手动删除,镜像将无法自动同步,需要重做主备镜像。
问题发现时如果主机(02)还未宕机,此时尝试解决备机(01)问题,启动备机(01),等待镜像自动同步即可。同步完成之后镜像日志将可以被定时任务定时清除。如果遇到较为复杂的情况,现场请第一时间联系您的软件供应商,软件供应商将协同系联软件全球响应中心一起来解决您遇到的具体问题。
为了避免以上的问题发生,现场运维需要对镜像的状态和磁盘的状态配置监控。
类和属性参数
XMLNAMEXMLSEQUENCEXMLUNSWIZZLE在 XML 中,仅包含属性的元素可以用以下任一方式表示:
IRIS 认为这些形式是等效的。当使用 %XML.Writer 导出对象时,可以控制关闭形式,但不能通过修改 投影本身来控制。
中的给定元素可以包含多个具有相同名称的元素;这些元素通过它们的顺序彼此区分。例如,以下是一个合法的 文档:
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Person>
<Name>Able, Andrew</Name>
<DOB>1977-10-06</DOB>
<Address>
<Street>6218 Clinton Drive</Street>
<City>Reston</City>
<State>TN</State>
<Zip>87639</Zip>
</Address>
<Address>
<Street>110 High Street</Street>
<City>Zanesville</City>
<State>OR</State>
<Zip>80719</Zip>
</Address>
</Person>
</Root>
如果需要 XML 架构来显示特定的类型层次结构,则需要了解映射如何解释 IRIS 类层次结构。
类层次结构代表了有意义的数据组织等。该层次结构尽可能地反映在相应的 XML 类型定义中。
例如,假设有以下类:
Base 的类,定义了三个公共属性(Property1、 和 )。Addition1)。Addition2)。 的架构应包含什么?它必须代表所有五个属性。另外,因为这些类都是用户定义的,所以 的架构应该显示类层次结构的详细信息;相反,如果 Base 从 类库扩展一个类,而 类库又从该库扩展其他类,那么这些细节就不那么有趣了。
相应地, 的 模式默认如下所示:
<s:complexType name="Addition2">
<s:complexContent>
<s:extension base="Addition1">
<s:sequence>
<s:element name="Addition2" type="s:decimal" minOccurs="0" />
</s:sequence>
</s:extension>
</s:complexContent>
</s:complexType>
<s:complexType name="Addition1">
<s:complexContent>
<s:extension base="Base">
<s:sequence>
<s:element name="Addition1" type="s:string" minOccurs="0" />
</s:sequence>
</s:extension>
</s:complexContent>
</s:complexType>
<s:complexType name="Base">
<s:sequence>
<s:element name="Property1" type="s:string" minOccurs="0" />
<s:element name="Property2" type="s:decimal" minOccurs="0" />
<s:element name="Property3" type="s:date" minOccurs="0" />
</s:sequence>
</s:complexType>
XML 模式规范还允许定义替换组,这可以是创建选择的替代方法。语法有些不同。
根据 XML Schema 规范,复杂类型可以由类型(特别是相关类型)的选择列表组成。假设我们希望架构允许使用 , , or 元素,而不是 元素。要定义这样的架构,我们会将 Person 属性的 属性参数设置为等于“CHOICE”,如下所示:
Class UsingSubclasses.Example2 Extends (%Persistent, %XML.Adaptor)
{
Property Person As UsingSubclasses.Person(XMLTYPECONSTRAINT = "CHOICE");
}
默认情况下,选择列表由 类的所有子类组成。示例 的架构如下:
<s:complexType name="Example2">
<s:sequence>
<s:choice minOccurs="0">
<s:element name="Employee" type="Employee" />
<s:element name="Patient" type="Patient" />
<s:element name="Person" type="Person" />
</s:choice>
</s:sequence>
</s:complexType>
<s:complexType name="Employee">
<s:complexContent>
<s:extension base="Person">
<s:sequence>
<s:element name="EmployeeID" type="s:string" />
</s:sequence>
</s:extension>
</s:complexContent>
</s:complexType>
<s:complexType name="Person">
<s:sequence>
<s:element name="Name" type="s:string" />
<s:element name="DOB" type="s:date" />
</s:sequence>
</s:complexType>
<s:complexType name="Patient">
<s:complexContent>
<s:extension base="Person">
<s:sequence>
<s:element name="PatientID" type="s:string" />
</s:sequence>
</s:extension>
</s:complexContent>
</s:complexType>
类和属性参数
XMLTYPECONSTRAINT
XMLINCLUDEINLIST
XMLINHERITANCE
当为一个类定义 XML 投影时,它的所有子类都会自动映射到单独的类型,所有这些类型都使用超类作为基类型。这意味着无论何时使用超类型,都可以使用其中一种子类型。还可以使用子类型在 XML 模式中定义选择列表或替换组。
请注意,可以为抽象类定义 XML 映射;该类在任何派生类模式中都显示为基类型,尽管它是抽象的,无法实例化。
考虑一个例子。我们从一个简单的 类开始:
Class UsingSubclasses.Person Extends (%Persistent, %XML.Adaptor)
{
Property Name As %String [Required];
Property DOB As %Date(FORMAT = 5, MAXVAL = "+$h") [Required];
}
假设我们有两个直接基于 Person 类的类。首先是 Patient 类:
Class UsingSubclasses.Patient Extends UsingSubclasses.Person
{
Property PatientID As %String [Required];
}
XML 的类到 XML 类型的映射对于支持 XML 的类或基于支持 的类的属性,XML 类型按如下方式确定: 如果该类具有 参数的值,则该值将用作类型名称。否则,短类名将被视为 类型名。
例如,考虑以下类定义:
Class GXML.PersonWithAddress Extends (%Persistent, %XML.Adaptor)
{
Parameter XMLTYPE = "PersonType";
Property Name As %Name;
Property DOB As %Date(FORMAT = 5, MAXVAL = "+$h");
Property HomeAddress As GXML.Address;
}
对于此类的实例, 类型是 ,它取自 参数。
假设 类不包含 参数。在本例中,对于 元素, 类型是 ,它是短类名。
类型分配给命名空间,如下所示:
XSDTYPE 类参数,则该类型位于以下 W3 命名空间中:http://www.w3.org/2001/XMLSchema
只能在数据类型类中指定 。
注意:数据类型类不继承 类参数。
本部分显示了从支持 XML 的类生成的 XML架构的一部分,该类包含定义为 %ListOfObjects 的属性。例如,考虑以下属性定义:
Property PropName As list Of %Integer(XMLITEMNAME = "MyXmlItemName");
如果此属性位于名为 的启用 的类中,则该类的 XML 架构包含以下内容:
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:s="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
targetNamespace="mytypes">
<complexType name="DemoObjList1">
<sequence>
<element minOccurs="0" name="PropName" type="s01:ArrayOfMyXmlItemNameRegisteredObject" xmlns:s01="mytypes"/>
</sequence>
</complexType>
<complexType name="ArrayOfMyXmlItemNameRegisteredObject">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="MyXmlItemName" nillable="true" type="s01:RegisteredObject" xmlns:s01="mytypes"/>
</sequence>
</complexType>
...
</schema>
%ListOfDataTypes本部分显示从支持 XML 的类生成的 XML 架构的一部分,该类包含中定义为%ListOfDataTypes 的属性。例如,考虑以下属性定义:
Property PropName As %ListOfDataTypes(XMLITEMNAME = "MyXmlItemName");
如果此属性位于名为 的启用 的类中,则该类的 XML 架构包含以下内容:
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:s="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="mytypes">
<complexType name="DemoList">
<sequence>
<element minOccurs="0" name="PropName" type="s01:ArrayOfMyXmlItemNameString" xmlns:s01="mytypes"/>
</sequence>
</complexType>
<complexType name="ArrayOfMyXmlItemNameString">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="MyXmlItemName" nillable="true" type="s:string"/>
</sequence>
</complexType>
</schema>
Array of Classname本部分显示了从启用 XML 的类生成的XML 架构的一部分,此时该类包含定义为类名数组的属性。例如,考虑以下属性定义:
Property PropName As array Of %Integer(XMLITEMNAME = "MyXmlItemName", XMLKEYNAME = "MyXmlKeyName");
如果此属性位于名为 的启用 XML 的类中,则该类的 XML 架构包含以下内容:
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:s="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="mytypes">
<complexType name="DemoArray1">
<sequence>
<element minOccurs="0" name="PropName" type="s01:ArrayOfMyXmlItemNamePairOfMyXmlKeyNameLong" xmlns:s01="mytypes"/>
</sequence>
</complexType>
<complexType name="ArrayOfMyXmlItemNamePairOfMyXmlKeyNameLong">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="MyXmlItemName" nillable="true" type="s01:PairOfMyXmlKeyNameLong" xmlns:s01="mytypes"/>
</sequence>
</complexType>
<complexType name="PairOfMyXmlKeyNameLong">
<simpleContent>
<extension base="s:long">
<attribute name="MyXmlKeyName" type="s:string" use="required"/>
</extension>
</simpleContent>
</complexType>
...
</schema>
TCP作为OSI 7层的传输层的通信协议,其使用上不像更上层的通信协议那么方便,因为TCP操作的不是数据包,它操作的是数据流。因此有多种将TCP数据流“解释”为数据包(消息)的方法。
InterSystems IRIS提供了多种TCP适配器,用于不同的“解释”,例如EnsLib.TCP.FramedInboundAdapter使用特定的首尾字符做为分隔、EnsLib.TCP.CountedInboundAdapter使用固定的长度进行分隔...
同时,InterSystems IRIS提供了多种开箱即用的TCP业务服务和业务操作,方便接入和发送TCP数据。这里我们介绍常见的使用特定的首尾字符做为分隔的TCP业务服务和业务操作。
EnsLib.TCP.Framed.PassthroughService和EnsLib.TCP.Framed.PassthroughOperation是一组使用特定的首尾字符做为分隔TCP数据流的通用业务服务和业务操作。EnsLib.TCP.Framed.PassthroughService业务服务会将TCP数据封装在Ens.StreamContainer发送给业务流程或业务操作;而EnsLib.TCP.Framed.PassthroughOperation业务操作发送并接收Ens.
InterSystems IRIS 提供了一组通用的RESTful 业务服务和业务操作类,用户无需开发自定义的业务服务和业务操作类,就可以直接向外提供RESTful服务和调用外部的RESTful API。
| BS | EnsLib.REST.GenericService | 通用REST业务服务 |
| BS | EnsLib.REST.SAMLGenericService | 检查SAML令牌的签名和时间戳的REST业务服务 |
| BO | EnsLib.REST.GenericOperation | 通用REST业务操作 |
| BO | EnsLib.REST.GenericOperationInProc | 用于透传模式的通用REST业务操作 |
通用的RESTful 业务服务和业务操作类使用一个通用的RESTful消息类 - EnsLib.REST.GenericMessage,它是EnsLib.HTTP.GenericMessage的子类,二者数据结构都是
| HTTPHeaders | 记录http头的数组 |
| Stream | 记录http体的数据流 |
| Type | 数据流类型,例如是字符流还是二进制流。 |
我们继续使用FHIR适配器的示例,在本文中,我们将回顾如何在我们的IRIS实例中进行配置以及安装的结果。
配置项目的步骤与官方文档中所示的相同,您可以直接在此处查看。好吧,让我们开始工作吧!
正如您在与本文相关的项目中看到的,我们将 IRIS 实例部署在 Docker 中,因此初始配置的主要部分将在 Dockerfile 中完成。别担心,我们不会详细介绍 Docker 配置。
要安装 FHIR 适配器,我们只需:
set##class"/Adapter/r4"在我们的例子中,我们定义了将接收 REST 请求的 IRIS 端点的 URL 为/Adapter/r4 。
FHIR 适配器安装完成后,我们可以查看 IRIS 实例中发生的情况。为此,我们首先查看 Web 应用程序菜单(系统管理 -> 安全 -> 应用程序 -> Web 应用程序)
.png)
正如我们所看到的,一个新的 Web 应用程序已添加到列表中,表明它对应于我们的 ADAPTER 命名空间。让我们访问它以更详细地查看其配置。
正如我们所看到的,创建的 Web 应用程序启用了 REST 调用的接收,并且负责管理这些调用的类是HS.
想必大家都听说过 FHIR 是解决系统间所有互操作性和兼容性问题的灵丹妙药和解决方案。就在这里,我们可以看到他手持一份 FHIR 资源,愉快地享受其中:
.png)
但对于我们这些普通人,我们将做一个小小的介绍。
让我们直接进入定义:FHIR(Fast Healthcare Interoperability Resource)是由HL7(Health Level 7标准组)开发的一种互操作性标准,旨在实现医疗行业中不同系统之间的电子医疗数据交换。
主要是通过 REST API 和 JSON 格式进行 HTTP 调用的结合(尽管它可以是 XML 以及我们可用的任何其他通信,具体根据我们的使用情况)。
一般来说,最简单的方式是拥有一个FHIR服务器,我们将使用诸如GET(从服务器获取数据)、PUT(更新数据)、POST(保存数据)和DELETE(删除数据)等HTTP调用与其通信。
FHIR处理了“资源”(Resource)的概念,用于在服务器和客户端之间发送和接收数据。这些资源旨在涵盖系统间80%的互通性需求。在这里,我们可以看到默认情况下可用的资源图示。
如您所见,每个资源都附带一个表示资源成熟度的数字或字母(其中N = 正式)。如果您访问官方的FHIR文档,您将能够获取到众多示例。
随着网络安全日益被重视,特别是等级保护制度的大环境下,SSL加密传输越来越被重视,本文介绍如何使用支持SSL的ODBC连接IRIS数据库。
数据库版本:IRISHealth-2023.1
1)新建SSL服务器配置。
.png)
2)开启超级端口的SSL支持,这里我们选择启用即可,如所有超级端口的连接都支持SSL可选要求。
1)创建 SSLDefs.ini 配置文件,并编辑内容:
[TLS to an InterSystems IRIS instance]
Address=127.0.0.1
Port=51773
SSLConfig=DHCC
[DHCC]
TLSMinVersion=8
TLSMaxVersion=16
CipherList=ALL:!aNULL:!eNULL:!EXP:!SSLv2
KeyType=2
VerifyPeer=1
Password=
CertFile=E:\ADSSL\ADSSL.crt
KeyFile=E:\ADSSL\ADSSL.
由于国内使用基于M语言IRIS平台几乎都在医疗行业。医疗系统又非常的庞大和复杂。前期由于快速占领市场,系统数量越来越多,到了临界点后就产生了质变,所以前期基于功能的线性开发注重效率,所以导致大量的产品业务代码有如下集中情况:

如上图所示,这仅仅是展示了五个模块之前的交互,在此基础上继续增加模块则复杂度成指数级上升,并且如果每个模块之间如果没有做好接口管理,维护起来也是地狱级别。
如何解决这个问题,一般会分为两派:优化派与架构派。
优化派的思想是将现有的系统优化。例如重构某个方法,优化某个SQL。优化派的优势是针对系统改动较小,可以保持系统的稳定性,可以快速实施,缺点是治标不治本,随着需求越来越多,增加的代码量越多,后期还是会撑不住。
架构派的核心思想是调整系统架构,将原来的大系统拆分为多个互相配合的小系统,例如药库系统拆分为,采购模块,订单模块,查询模块,分析模块等。架构派的优势是一次调整可以支撑比较长期的业务发展,缺点是动作较大,耗时较长,稳定性需要项目考验。
前言
在日常工作中经常会遇到大量的接口开发需求,对于没有IRIS开发经验的同事来说很不友好,需要求助于公司开发人员来做接口开发,对项目联调进度多少会有些影响,本文站在没有IRIS开发经验的工作人员角度来阐述一下如何利用xslt转换文件自动生成接口联调所需要的Message模型。
基本思路是首先定义一套通用的数据模型,用来接收定义消息所需要的基础属性,包括类名,请求&响应(对应继承Ens.Request&Ens.Response),节点名称、节点长度、是否必填、默认值、字段约束等等。
Class M.MSG.CreatMSGRequest Extends (Ens.Request, %JSON.
这是Java 编程比赛的相关文章。
我决定推出一个基于 IRIS Native API for Java 的 CRUD++ Global编辑器。
++因为它不仅仅是C reate、 R ead、 U pdate、 D elete
Global可视化对于立即查看结果始终很重要。
这需要在服务器端有一个小的帮助器类作为默认 API 的扩展
我的策略是拥有一个可从命令行使用的相当适度的界面
就像在 Docker 控制台或终端上一样,并使其尽可能简单。
花哨的图形界面只会分散示例的基本内容。
如果有任何默认值或先前的值,则会在输入提示中显示。
在 Docker 容器中,编辑器已经可以使用了。
您首先连接到服务器
欢迎使用 IRIS NativeAPI 全局编辑器
>>> 服务器IP [127.0.0.1]:
>>> 服务器端口 [1972]:
>>> 命名空间 [用户]:
>>> 用户名 [_SYSTEM]:
>>> 密码[SYS]:
连接到服务器 127.0.0.1:1972 上的命名空间 USER我们最近发布了一份关于在镜像环境中使用报告节点(完整的“异步报告镜像成员”)的新白皮书。越来越多的客户正在研究这种机制,将其作为一种快速、简单的方法来设置保持最新的生产数据副本,但可以用于分析查询或重型报告工作负载,而不影响源系统。 请在此处阅读白皮书。
与往常一样,我们很想听听您对如何在组织中使用此镜像选项的反馈,以及您是否对我们如何提高其效率有想法。
本主题介绍如何发送HTTP请求(如POST或GET)和处理响应。
可以创建的实例来发送各种请求并接收响应。此对象相当于Web浏览器,可以使用它发出多个请求。它会自动发送正确的cookie,并根据需要设置标头。
要创建HTTP请求,请使用以下常规流程:
%Net.HttpRequest的实例。localhost。注意:不要将或作为服务器值的一部分。这将导致错误。
%Net.HttpRequest实例的get()方法或其他方法来发送HTTP请求,如“发送HTTP请求”中所述。可以从实例发出多个请求,它将自动处理cookie和Referer标头。
注意:如果创建此HTTP请求是为了与生产出站适配器(EnsLib.HTTP.Outbound Adapter)一起使用,那么请改用该适配器的方法来发送请求。
%Net.HttpRequest的同一实例发送其他HTTP请求。默认情况下,InterSystems IRIS使TCP/IP套接字保持打开状态,以便可以重复使用套接字,而无需关闭和重新打开它。