清除过滤器
公告
Claire Zheng · 三月 7, 2021
亲爱的开发者,
最近我们收到很多类似“如何成为一个活跃(Active)、有贡献值的成员”的问题。
条件很简单!
1. 回答问题
我们有许多未得到回答的问题, 以及 还没有收到有效回答的问题. 非常欢迎您在这些问题上共享您的见解和回答,帮助其他社区成员成长!
2. 撰写文章,发布帖子
撰写您使用InterSystems技术的经验和心得:解决方案、开发心得、解决bug的小技巧、部署等等。
这里是一些 帖子示例 ,这些帖子都对我们的社区建设很有帮助。
除了中文社区外,我们还有英语社区、日语社区、葡语社区等等,我们也欢迎您将这些社区里的文章翻译成中文进行发布!
3. 在Open Exchange提交应用程序
通过Github、Gitlab或任何其他公共存储库,在Open Exchange上共享您的库、解决方案和工具。
如果您对社区有什么问题和建议,欢迎跟帖回复、畅所欲言!我们欢迎大家共同建设社区,使这个社区对中国使用InterSystems技术的开发者们越来越有用!
请新注册的同学们阅读这篇文章,多问问题发帖子/有效评论;
或者多回答问题,中英文都可以:
https://cn.community.intersystems.com/?filter=questions;
https://community.intersystems.com/?filter=questions
文章
Michael Lei · 六月 26, 2022
下面的代码允许用户查看其实例的审计设置。通过运行类方法 "test "来运行该代码。:
class objectscript.checkAudit Extends %RegisteredObject
{
classmethod test() {
w "Checking for Auditing...",!
Set SYSOBJ = ##class(Security.System).%OpenId("SYSTEM")
If +SYSOBJ = 0 Set SYSOBJ = ##class(Security.System).%New()
i SYSOBJ.AuditEnabled {
w "Security Auditing is enabled for the following services",!
s rs=##class(%ResultSet).%New("Security.Events:ListAllSystem")
s sc=rs.Execute() If $$$ISERR(sc) Do DisplayError^%apiOBJ(sc) Quit
while rs.%Next() {
d:rs.Data("Enabled")="Yes" rs.%Print()
}
d rs.Close()
s rs=##class(%ResultSet).%New("Security.Events:ListAllUser")
s sc=rs.Execute() If $$$ISERR(sc) Do DisplayError^%apiOBJ(sc) Quit
while rs.%Next() {
d:rs.Data("Enabled")="Yes" rs.%Print()
}
d rs.Close()
}
}
}
这是 GitHub的链接: https://github.com/intersystems-community/code-snippets/blob/master/src/cls/objectscript/checkAudit.cls
问题
li wang · 四月 23, 2022
各位老师,你们好
我在浏览器地址中输入HealtConnect发布的webService地址报 CSP应用程序错误,并记录了此错误,不过该地址还是能正常访问。
我想知道怎么解决这种报错问题,谢谢!
以下图片为HealthConnect的版本,以及具体出现的错误
建议联系我们WRC团队support@intersystems.com 或者电话:4006019890或者对应的客户经理,谢谢! 应该是没开启SOAP测试页能力。搜一下三级等保文章,里面有介绍 https://cn.community.intersystems.com/smartsearch?search=InterSystems+数据平台与三级等保+-+第一篇
文章
姚 鑫 · 十一月 1, 2024
# 第八章 在 I/O 命令中指定设备 - 通过 IRIS ID 指定设备
# 通过 IRIS ID 指定设备
为了与其他 产品兼容并方便起见,可以通过设备编号(存储在设备表中)来引用设备。系统管理员可以使用管理门户将这些号码链接到设备。选择“系统管理” 、 “配置” 、 “设备设置” 、 “设备”以创建新设备或编辑现有设备。
系统管理员还可以将一个数字转换为另一个数字。因此,可以发出`OPEN 47` , `IRIS` 会将其转换为`OPEN 49` 。
下表显示了设备编号。
### IRIS 设备编号和设备
Device Numbers 设备编号| Devices 设备
---|---
`0`|主要设备(您登录的设备)。
`2`| `IRIS` 假脱机程序。 `UNIX®`:助记符 `SPOOL` 适用于该设备。
`3`| 设备编号无效。尝试打开它会返回 `` 错误,而不等待超时到期。
`63`| 查看缓冲区。
`20-46, 200-223`| 常规联锁装置。
`224-255` |作业间通信设备。
# 示例
要打开假脱机程序,请发出以下命令:
```java
OPEN 2
```
# 指定磁盘上的文件
可以使用双引号括起来的操作系统文件规范来打开磁盘文件。
`Windows` 文件规范具有以下格式:
```java
device:\directory\file.type
```
`UNIX®` 文件规范具有以下格式:
```java
/directory/name
```
# UNIX 示例
如果 `UNIX®` 或 `Windows` 系统上的当前默认目录是 `/usr/user`,则可以通过指定以下方式打开存储在当前默认目录中的名为`pat_rec.dat`的文件:
```java
OPEN "pat_rec.dat"
```
系统自动打开该文件。对于新文件,请包含参数字符串`WN`以避免挂起。
要打开存储在另一个目录中的同名文件`pat_rec.dat` ,还必须指定该目录,如下所示:
```java
OPEN "/usr/elsewhere/pat_rec.dat"
```
文章
Jingwei Wang · 六月 6, 2022
Object Script(六)
变量的类型
ObjectScript中的变量是没有类型的,也就是说,它们没有一个指定的数据类型,可以接受任何数据值。
ObjectScript支持以下几种类型的变量:
1. 本地变量 :只有创建它的进程可以访问的变量,当该进程终止时,改变量将自动删除。一个本地变量可以从任何命名空间访问。
示例:
SET str = "A string"
2. 进程私有的全局变量 : 只有创建它的进程可以访问的变量,并且在进程结束时不再存在。一个进程专用的全局变量可以从任何命名空间访问,因为它与命名空间无关。进程私有的全局变量对于临时存储大数据值特别有用。在许多情况下,它们可以替代Mgr/Temp目录的使用,在进程终止时提供自动清理。
示例:
SET ^||flintstones(1)="Fred"
SET ^||flintstones(2)="Wilma"
3. 全局变量 : 一个存储在InterSystems IRIS数据库中的持久性变量。一个全局变量可以从任何进程中访问,并且在创建它的进程终止后仍然存在。全局变量是针对个别命名空间的。
示例:
SET ^myglobal = "This is a global stored in the current namespace"
4. i%property实例变量
当你创建任何类的实例时,系统会为该类的每个非计算属性创建一个实例变量。实例变量持有该属性的值。例如,如果一个类有Name和DOB属性,那么实例变量i%Name和i%DOB就可以在该类的任何实例方法中使用。实例变量有进程私有的。请注意,这些变量不在本地变量符号表中,不受Kill命令的影响。InterSystems IRIS也使用额外的实例变量,名称为r%PropName和m%PropName,但这些变量不支持直接使用。
5. 特殊变量(也称为系统变量) : 一组特殊的内置变量之一,用于某些应用程序使用的系统信息。所有的特殊变量都是由InterSystems IRIS提供的,并以"$"字符前缀命名。用户不能定义额外的特殊变量。特殊变量集被映射为可从所有命名空间访问。
示例:
$HOROLOG
文章
姚 鑫 · 二月 16
# 第二十六章 S 开头的术语
### 共享锁 (shared lock)
**对象(Objects)**
共享锁在对象从数据库加载期间保持共享锁,并在保存期间保持独占锁(如果跨多个节点或正在更新)。对于第一次在单个节点上保存的对象,不会获取锁。
### 共享保留锁 (shared retained lock)
**对象(Objects)**
共享保留锁从对象从数据库加载到关闭期间保持共享锁,并在保存期间保持独占锁(如果跨多个节点或正在更新)。对于第一次在单个节点上保存的对象,不会获取锁。
### SOAP
**通用**
用于实现 Web 服务的协议规范。它使用 `XML` 作为消息格式,通常依赖其他应用层协议,例如远程过程调用(`RPC`)和 `HTTP`,用于消息协商和传输。`` 曾是“简单对象访问协议”(`Simple Object Access Protocol`)的缩写,但现在不再是缩写——它只是该协议的名称。
### 特殊变量 (special variable)
**系统**
`IRIS` 维护的众多变量之一。应用程序开发人员可以检查特殊变量以获取有关系统的信息。
### SQL
**通用**
结构化查询语言(`Structured Query Language`)。`SQL` 是 `ANSI` 标准的第四代编程语言,专为访问和维护关系数据库而设计。
### SQLCODE
**InterSystems SQL**
一个本地变量,保存已执行 `SQL` 语句的状态。如果执行期间发生错误,`SQLCODE` 包含错误号。
### SQL 计算字段 (SQL computed field)
**对象(Objects)**
SQL 计算字段按需计算,基于存储在其他字段中的值。
### SQL 映射 (SQL mapping)
**对象(Objects)**
SQL 映射用于将现有数据结构映射到类和表。
### SQL 查询 (SQL query)
**InterSystems SQL**
`SQL` 查询使用 `SQL` 来定位和检索存储在数据库中的信息。
### SQL 保留字 (SQL reserved words)
**InterSystems SQL**
`SQL`保留字在 `SQL` 中具有特殊含义,不能用作表、字段、查询、视图、存储过程或索引名称。如果定义了备用表和字段名称,`SQL` 保留字可以用作类和属性名称。
### 状态码 (status code)
**对象(Objects)**
一些方法返回的状态码,指示方法是否成功执行。请参见 `%Status`。
### 存储定义 (storage definition)
**对象(Objects)**
存储定义由存储类和任何定义的 `SQL` 映射组成。这些元素共同决定数据的存储方式。
文章
Johnny Wang · 十一月 21, 2021
当我和加州大学戴维斯分校健康中心的同事着手简化提供者对基因组数据报告的访问时,我们希望这些信息能帮助临床医生提供更好、更个性化的护理。 我们的基因组数据没有操作界面,既不可搜索,也不与患者图表相关联。 如果我们可以在 FHIR(快速医疗互操作性资源)连接器上利用SMART原则在平台之间实现单点登录,我们的护理团队就可以更早地获得数据,患者将能够更好地得到照顾,并在与癌症的斗争中取得积极成果。
而这也是正在实现的事情。 我们支持基因组数据报告的工作为临床医生带来了 50 个离散数据点,这意味着医生用于搜索报告的时间更少,也拥有了更多具有重要洞察力的离散数据,简化了对临床试验信息的访问,最终患者也得到了及时的护理。
但我们并没有停下脚步,这不过是迈向更广阔数字领域的第一步。在 InterSystems 的帮助下,我们拥有了规模越来越大、类型更多样的数据集。
回到本文的标题——什么是医疗数字领域的门户?它是某人(通常是患者)与您的医疗单位的每次虚拟来往的总和。根据研究公司 IDC 的数据,到 2023 年,65% 的患者都将会通过这样的门户和对应的医疗机构进行来往,但剩下的其他人呢?所以在加州大学戴维斯分校健康中心,我们决心建立一个欢迎所有人的数字门户——不仅是基因组数据供应商,还有患者、付款人和合作伙伴。
通过变得更加灵活和高效,我们不断推陈出新,提高整个健康中心的效率,并优化对患者的护理。 以下是我总结的为什么数字门户可以帮助每个医疗机构的观点:
1. 是时候加强互操作性工作了
在加州大学戴维斯分校健康中心,我们决定推动我们的数字门户战略,也因为我们不想被 FHIR 潮流所抛弃。随着苹果等公司的健康应用工具使用率的不断上升,基于SMART原则和FHIR构建的应用程序一直在不断提醒供应商们尽快去拿到多年来一直对第三方关闭的数据,而我们的数字门户成为了我们巧妙地驾驭 FHIR 潮流所需的工具和技术。 此外,很明显,《21世纪药物法案草案》将要求医疗系统支持更进一步的互操作性,以便患者访问其数据。
没有多少医疗机构为此制定了数字门户战略。 尽管我们花了数年时间从本土遗留系统和内部应用程序过渡到同类最佳技术,但互操作性描述了数据在内部移动,而不是外部移动。
我们本可以选择将付款人和合作伙伴直接连接到我们的 EHR,但这无法访问位于其他地方的数据。 对于我们的合作伙伴来说,这也可能意味着更高的成本和更大的难度,同时每个应用程序和合作伙伴连接都受制于各自的供应商。
现在,我们加州大学戴维斯分校健康中心使用首选的解决方案堆栈开发了自己的架构——InterSystems IRIS for Health™ 和 HealthShare® 处理了平台外存储的大量数据、连接的非 FHIR 应用程序,并使我们能够创建确保所有合作伙伴都能访问的规则。
在一年多一点的时间里,我们为 InterSystems API 管理器部署了一个开发端点,我们正在与几个合作伙伴合作开展试点项目,以将它们连接到我们的 API 库。 世界正在快速发展时,医疗行业也必须如此。
2. 你真的想用大量不同的技术去拼凑你的数字门户吗?
加州大学戴维斯分校健康中心的数字门户之所以能脱颖而出,是因为我们决心要打造围绕一个互操作性的先进中心。
大多数医疗系统采用联合模型,在一个桶中解决临床数据聚合以及与 FHIR、接口和研究相关的举措。 在加州大学戴维斯分校健康中心,我们有一个专门的团队和一个支持模型来推动整个组织内的数据交换。这意味着强大的灵活性。 例如,新冠病毒的来临颠覆了一切,许多医院不得不与三个甚至更多的供应商争吵,以适应对虚拟服务不断增长的需求。 而我们只用一个小组就快速完成了工作。
随着美国互操作性核心数据 (USCDI) 标准的实施,医疗系统必须能够访问电子健康信息,这些信息存在于医疗系统、数字生态系统的每个角落和缝隙中。 共享存在于 EHR 中的临床数据是不够的。宽阔的数字门户——通过一个入口点就可以进入——是我们最好的选择。
3. 走在时代的前沿
我知道并非所有医疗系统都拥有相同的资源,但任何人都可以适应的技术才是真正的创新。
医疗机构需要根据 USCDI 标准为患者数据的访问去开发解决方案。 如果您具备了这样的开发能力,为什么不多做一步——授权患者、付款人和合作伙伴都能够使用这种资源呢?
如果您这样做了,您会发现您已准备好应对围绕基因组学、远程患者监测以及未来的任何其他事物所带来的创新。
关于作者:Michael Marchant
Michael Marchant 在过去 25 年多的时间里一直在和复杂的技术打交道,他一直致力于整合数据,以引领医疗机构的发展。Michael 一直与应用程序供应商、提供商组织以及政府密切合作,领导团队并提供所需的解决方案、技术、工作流程,致力于内部以及当地乃至全国的互操作性推动。 Michael 目前担任加州大学戴维斯分校健康中心的健康信息交换和系统集成总监,他和他的团队为他的组织和社区解决了大量复杂的技术难题和互操作性层面的挑战。 Michael 热衷于推动将患者和患者的健康信息联系起来的技术,并帮助患者能够控制何人、何时以及何地可以访问这些信息。
点击查看原文
2021年12月8日——全球领导力峰会,立刻注册!
InterSystems 可以帮助您实现互操作性和数据集成目标。立刻联系我们!
问题
王喆 👀 · 四月 24, 2021
修改过用户门户之后,重新启动就报这个错,然后使用自带的修复功能,修复之后依然报错,日志中显示没有C:\InterSystems\HealthConnect\mgr\IRIS.WIJ,我复制了别人的过来依然报错,由于代码没有做备份我不能重装,有没有什么办法修复一下,或者把代码备份一下,我再重装。
如果由于修改系统文件、误删除文件等问题导致系统启动、初始化等过程失败,还请联系WRC解决故障。 WRC 联系方式:
support@intersystems.com
400-601-9890
https://wrc-china.intersystems.com/wrc/login.csp
公告
Claire Zheng · 一月 7, 2021
亲爱的社区用户,您好!
您可能知道,您在 Open Exchange 上每发布一个应用程序都会获得 [Global Masters](https://intersystems.influitive.com/) 积分奖励。 最近,我们针对 [ZPM](https://openexchange.intersystems.com/package/ObjectScript-Package-Manager) 应用程序推出了附加积分。 **现在,您的每个 ZPM 应用程序都会为您赢得额外的 400 积分!**积分将自动调整。
立即查看 Global Masters 上的积分和可用奖励!
如果您对 Global Masters 有任何疑问,欢迎在下面的评论中提问。
* * *
关于 Global Masters 的其他信息:
什么是 Global Masters? 从这里开始如何在 InterSystems Global Masters 上获得积分
文章
Michael Lei · 二月 26, 2021
不少客户问我关于从Cache迁移到IRIS的问题。为什么要迁移到IRIS?Cache是优秀的,稳定的,有很好的性能,为什么要迁移到IRIS呢?这些客户是对的,但在过去几年,数字化转型提出了不少新问题、新需求和新挑战,客户需要更灵活、更完整、更前瞻的解决方案,InterSystems公司很有远见地洞察到了这一点,推出了IRIS。一句话,IRIS是一套数据平台解决方案,它帮助客户和合作伙伴为迎接数字化转型的挑战提供了充足的弹药。
文章
Qiao Peng · 五月 25, 2022
%SYS.Journal.Record 类有一个查询(query), List, 可以列出Journal文件中记录的数据修改历史。例如,要查询谁对global节点^QP(1,2)做过修改,可以使用如下代码。它查询Journal文件(输入参数pFilePath)中的global节点(输入参数pSearchGlobal)的操作:
ClassMethod SearchGlobal(pSearchGlobal = "^QP(1,2)", pFilePath = "C:\InterSystems\IRISHealth\mgr\journal\20220525.003")
{
Set tRS = ##class(%ResultSet).%New("%SYS.Journal.Record:List")
Set tSC = tRS.Execute(pFilePath)
While (tRS.Next())
{
Set address = tRS.Data("Address")
Set globalNode = tRS.Data("GlobalNode")
Set newValue = tRS.Data("NewValue")
Set type = tRS.Data("TypeName")
Set processid = tRS.Data("ProcessID")
Set time = tRS.Data("TimeStamp")
Set globalRef = tRS.Data("GlobalReference")
If globalNode=pSearchGlobal
{
W !
W time,!
W processid,!
W address,!
W type," ",globalRef,"=",newValue,!
}
}
}
请问怎么用select调用?这个返回结果呢
文章
Hao Ma · 一月 30, 2021
本文介绍InterSystems Web Gateway的安装和配置。
在2018以前的ISC产品中, InterSystems Web Gateway被称为CSP Gateway。, CSP是Cache'的页面技术。InterSystems的产品页面,Web服务等大多是CSP写成的。IRIS发布后CSP Gateway改名成Web Gateway, 但内部的配置文件,说明等等还到处可见CSP Gateway的叫法。在本文里不同的地方有这两个说法别奇怪,他们是一个东西。
IRIS通过它和外部Web服务器连接。 本文的内容适用任何ISC产品的部署,包括页面的选项Cache'. IRIS,HealthConnect, Ensemble等等。它的作用和表现是一样的。 无论您使用的是Cache',IRIS , HealthConnect还是HealthShare, 只有在生产环境中使用HTTP请求,基本上都需要使用Web Gateway。
如果需要更详细的内容,请参考在线文档:[InterSystems Web Gateway](https://docs.intersystems.com/healthconnectlatest/csp/docbook/DocBook.UI.Page.cls?KEY=PAGE_web_gateway)
### 什么是Web Gateway
CSP是Cache' Server Page的缩写,如同JSP(Java Server Page)是Java的前端技术, CSP是InterSystems的前端技术。要在IRIS或者HealthConnect上提供一个HTTP服务,唯一安全可靠的技术是CSP. 创建HTTP,REST服务直接创建CSP页面, 创建SOAP服务使用%SOAP.WebService或者EnsLib.SOAP.Service, 它们都是%CSP.Page的子类,因此在IRIS的在线文档中有CSP Server的称法,指的就是IRIS中负责CSP处理的那部分功能。
CSP Server并不监听TCP端口得到HTTP消息,它只能通过CSP Gateway从Web服务器接收请求。用户的请求要先发给IIS/Apach/Nginx等Web服务器,转发给IRIS, 而Web Gateway就是Web服务器发请求给IRIS所使用的网关。
或者说, 它是InterSystems提供的给第三方Web服务器的一个组件,或者称为模块。在Windows系统中是若干DLL库文件,在LINUX环境是SO动态链接库。安装CSP Gateway就是诸如”CSPa24.so"等文件拷贝到Web服务器的目录,将这些模块配置到Web服务器,并将以.csp,.cls,.zen结尾的HTTP请求发送给IRIS。如果Web服务器和IRIS独立安装在不同的硬件服务器上(更安全的方式),发送的是TCP消息,到IRIS的superserver端口,默认是51773(Cache'是1972)。
CSP Gateway支持3种Web服务器:IIS, Apache Web Server, Nginx。 后面的链接提供了完整的在各种操作系统中ISC产品支持的Web Server的版本: [IRIS支持的第三方Web Server列表](https://docs.intersystems.com/healthconnectlatest/csp/docbook/platforms/ISP_technologies.html#ISP_webservers)
听上去是不是挺简单?那用户还有什么可糊涂的?
### Private Web Server(PWS)带来的混乱
混乱来自IRIS的安装过程会安装一个私有的Apache Web服务器,被称作PWS。它的作用有两个:支持访问维护页面;给一个测试环境提供测试Web服务的能力。在线文档是这么描述PWS的:
>> The PWS is not supported for any other purpose.
For deployments of http-based applications, including REST, CSP, Zen, and SOAP over http or https, you should not use the private web server for any application other than the Management Portal; instead, you must install and deploy one of the supported web servers. For information, see the section “Supported Web Servers” in the online InterSystems Supported Platforms document for this release.(**如果要部署http应用, 包括在http或者https上层的REST, CSP, Zen, SOAP,你绝不能让除Management Portal以外的任何应用使用PWS. 你必须安装一个IRIS兼容的Web服务器。了解这部分内容, 请查看InterSystems在线文档的"Supported Web Servers"部分**)
然后很多用户没有意识到这个提醒。当安装IRIS时被问到”你想要安装CSP网关并未CSP网关配置外部Web服务器(IIS和Apache)吗?"时,他们选择了“不要安装CSP网关",然后浏览器接入维护界面,开发了若干Web服务,一直没有意识使用PWS访问IRIS上的Web服务在生产环境是不可接受的。PWS是一个非常轻量级的Apache Web服务器。它的程序包在IRIS安装目录下的httpd子目录里。IRIS启动后, 它开始工作,监听IRIS上配置的Web端口,默认是57772,或者52773.它的工作机制决定了它无法承受大的负载,因此不能用于生产环境的http应用。
它和CSP/IRIS Server的连接用的是与上面讲的CSP Gateway完全相同的方式,也就是说,这里有一个PWS专用的Gateway, 我们可以称它为Private CSP Gateway。为了写的更清楚,总结了下面几点:
***CSP Gateway***
- 安装IRIS实例时用户可以选择是否安装CSP Gateway. 如果这时没选择安装,后面可以用单独的安装包安装。
- 安装的程序可以放在任何位置。比如在Linux默认放在"/opt/webgateway"目录,配置文件在Web Gateway的配置文件目录。
- 访问CSP Gateway的管理页面是 http://WebServer:80/csp/bin/Systems/Module.cxw 。 (这里的WebServer是Web服务器的地址,➕它的端口是默认的80)
***PWS***
- 安装时自动安装
- 程序和配置都在IRIS的安装目录,比如"C:/InterSystems/HealthConnect/CSP/bin/"
- 访问管理页面的地址是 http://IRIS:57772/csp/bin/Systems/Module.cxw,这里的IRIS是IRIS服务器的地址,如果是本机登录,也就是localhost.
注意一点:从PWS访问IRIS管理页面, 比如 http://localhost/csp/sys/UtilHome.csp, 选择其中的 “系统管理 > 配置 > Web网关管理"进入的是PWS的配置。如果是从 http://WebServer/csp/sys/UtilHome.csp进入的IRIS管理页面, 那么同样的操作进入的是CSP Gateway的管理页面。 这很容易从页面显示的Web Server的类型和版本发现区别。
### 其他关于部署CSP Gateway的疑问
- 一个Web服务器可以连接多个CSP Gateway吗?
如果你真正理解了CSP Gateway, 你就明白它是Web服务器工作的一部分,比如在IIS里面它就是配置的一个虚拟路径。技术上你可以多配一个,但完全没有必要。 如果要把HTTP从一个Web服务器发到多个IRIS, 可以在一个Web Gateway里配置多个"Server Access"连接。
- 一个CSP Gateway是怎么连接多个IRIS Server的?
CSP Gateway可以配置多个"Server Access”, 只是要区分出收到的请求应该发给那个IRIS Server.如果分发给不同的IRIS的URL是不同的,比如CSP Gateway可以路由"/csp/demo1"到第一个IRIS, "/csp/demo2"到第2个IRIS。
- Web Server要和IRIS部署在一台服务器吗?
生产环境中, 部署单独的Web Server通常是好选择。为了安全起见,很多用户会部署Web Server的高可用。
如果Web Server和Caché/IRIS分别装在两台服务器,IRIS安装时选择“不要安装CSP网关”,在Web Server的服务器上安装单独的Web Gateway软件包,测试和Caché/IRIS的连接。
如果是Web Server和Caché/IRIS装在同一台服务器, 那么应该先安装Web Server, 然后使用Caché/IRIS安装包安装Caché, 选择 “安装CSP网关”, 这样CSP网关会被安装在Web Server的目录下, 相关的模块和Web Server配置也会自动完成。 如果顺序反过来, 那么需要手工配置Web Server, 增加的不必要的复杂步骤。
- 安装外部Web Server能使用私有Web Gateway吗?
对Web服务器有了解的用户更会有这样的疑问。既然Web Gateway只是给Web Gateway工作的程序组件,那么是否从外部服务器就可以直接使用私有的Web Gateway了,何必再多安装一个。 是的,技术上这样是可行的。前提是,1. 外部Web服务器和IRIS在一台硬件服务器上。2. 客户要对外部服务器的配置非常熟悉,可以手工配置外部Web服务器对私有Web Gateway的访问, 包括路径或者虚假路径,文件夹的访问权限,用户或者用户组的权限等等。总的说, 这样既麻烦,又不便于后期的管理,因此我推荐还是重新装一个Web Gateway。只是要分清它和私有的连接PWS的Web Gateway的区别,而永远不要让他们混在一起。
安装CSP Gateway的具体步骤请参考下面的文章:
WebGateway系列(2): 配置Apache连接IRIS
WebGateway系列(3): 配置IIS连接IRIS
文章
Jingwei Wang · 十二月 29, 2021
$HOROLOG($H)
表示当前的本地日期和时间,是由两个整数值组成的字符串,这些整数是计数器,是InterSystems IRIS存储格式,不是用户可读的日期和时间。
ddddd,sssss
代码示例:
w $H,!
北京时间2021年12月29日15:15:30时,输出结果为:
66107,54930
第一个整数,ddddd,是当前日期,表示为自1840年12月31日以来的天数,其中第1天是1841年1月1日。这个日期到达的最大年年限是9999年12月31日,所以这个整数的最大值是2980013。$HOROLOG不能直接用于表示1840年到9999年范围之外的日期
第二个整数,sssss,是当前的时间,表示为从当天午夜开始的秒数计数。系统将时间字段从0递增到86399秒。当午夜时分达到86399时,系统将时间字段重置为0,并将日期字段增加1。
你可以通过调用Horolog()方法获得相同的当前日期和时间信息,如下所示。
WRITE $SYSTEM.SYS.Horolog()
$NOW()
$NOW()返回当前进程的本地日期和时间,是InterSystems IRIS存储格式,不是用户可读的日期和时间。
ddddd,sssss.ffffff
代码示例:
w $NOW(),!
北京时间2021年12月29日15:15:30时,输出结果为:
66107,54930.383622
$ZTIMESTAMP
$ZTIMESTAMP返回UTC日期和时间,是InterSystems IRIS存储格式,不是用户可读的日期和时间。带有小数秒,小数秒以三位数的精度表示(Windows系统),或以六位数的精度表示(UNIX®系统)
代码示例:
w $ZTIMESTAMP,!
北京时间2021年12月29日15:15:30时,输出结果为:
66107,26130.383
$NOW() vs $HOROLOG vs $ZTIMESTAMP
$HOROLOG包含了InterSystems IRIS存储格式的、经过变体调整的本地日期和时间。本地时区是由$ZTIMEZONE特殊变量的当前值决定的,然后根据本地时间变体进行调整,如夏令时。它只返回整数秒,小数秒会被截断。
$NOW()根据$ZTIMEZONE特殊变量的值确定本地时区。本地时间不会因本地时间变体(如夏令时)而调整。因此,它可能与本地时钟时间不一致。$NOW(tzmins)返回与指定的tzmins时区参数对应的时间和日期。$ZTIMEZONE的值被忽略。
$ZTIMESTAMP返回UTC日期和时间。
日期和时间的转换
$ZDATE
将$HOROLOG的日期部分,即ddddd,转换为用户可读的形式。
WRITE $ZDATE($PIECE($HOROLOG,",",1))
输出结果为:
12/29/2021
$ZTIME
将$HOROLOG的时间部分,即sssss,转换为用户可读的形式。
$ZDATETIME
将$HOROLOG的日期和时间,同时转换为用户可读的形式。
当使用$HOROLOG时,在这些函数中设置时间值的精度总是返回零作为小数秒。
$ZDATETIME(hdatetime,dformat,tformat,precision,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt,localeopt)
$ZDT(hdatetime,dformat,tformat,precision,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt,localeopt)
参数描述请参考参数解析
参数
描述
hdatetime
内部格式的日期和时间值:$HOROLOG]或者 $ZTIMESTAMP
dformat
一个整数,指定返回日期值的格式
tformat
一个整数,指定返回时间值的格式
precision
一个整数,指定返回时间值的小数位数(小数秒):只有当hdatetime格式可以包括小数时间值($ZTIMESTAMP格式),并且选择的tformat选项包括秒时,精度才适用。
monthlist
可选的 - 一个字符串或一个变量的名称,用于指定一组月名。 这个字符串必须以一个分界符开始,它的12个条目必须以这个分界符分开。 例如: January February March April May June July August September October November December Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec monthlist仅在dformat为2、5、6、7、9、18或20时有效。
yearopt
一个整数代码,指定以两位数或四位数的数值表示年份。
startwin
滑动窗口的开始,在这个窗口中,日期用两位数的年份表示。 当你使用yearopt为3或5时,你必须提供startwin,startwin对任何其他yearopt值都是无效的。 当yearopt=3时,startwin是一个$HOROLOG日期格式的绝对日期,表示滑动窗口的开始日期。 当yearopt=5时,startwin是一个数值,表示滑动窗口的起始年份,以当前年份之前的年数表示。
endwin
滑动窗口的末端,在这个窗口中,日期用两位数的年份表示。 当yearopt为3或5时,你可以选择提供endwin。endwin在任何其他yearopt值下无效。 当yearopt=3时,endwin是一个$HOROLOG日期格式的绝对日期,表示滑动窗口的结束日期。 当yearopt=5时,endwin是一个数值,表示滑动窗口的结束年限,以当前年限后的年数表示。 当yearopt=5时,滑动窗口总是从startwin中指定的年份的1月1日开始,到endwin中指定的年份的12月31日结束,或者是隐含的结束年份(如果你省略endwin)。 如果省略endwin(或指定为-1),有效的滑动窗口将是100年的长度。 如果你同时提供startwin和endwin,它们指定的滑动窗口的持续时间不能超过100年。
mindate
有效日期范围的下限。指定为$HOROLOG的整数日期计数,例如 0代表1840年12月31日,2/22/2018表示为64701。 支持的mindate值:正的整数,0 或-1
maxdate
有效日期范围的上限,指定为整数$HOROLOG日期计数. 例如,1/1/2100表示为94599 指定一个大于maxdate的hdatetime日期会产生一个VALUE OUT OF RANGE错误。 指定一个大于2980013的maxdate会产生一个VALUE OF RANGE错误。 你可以指定maxdate,也可以不指定mindate。指定一个小于mindate的maxdate会产生一个ILLEGAL VALUE错误。
erropt
当hdatetime无效时要返回的表达式。为这个参数指定一个值可以抑制与无效或超出范围的hdatetime值有关的错误代码。$ZDATETIME不发出错误信息,而是返回erropt。
localeopt
一个布尔标志,指定对dformat、tformat、monthlist、yearopt、mindate和maxdate默认值以及其他日期和时间特征使用哪种语言: localeopt=0:当前语言属性设置决定这些参数默认值。 localeopt=1:ODBC标准语言决定这些参数默认值。 localeopt没有指定:dformat值决定这些参数默认值。
$ZDATETIMEH
将用户可读的日期和时间,转换为$HOROLOG(ddddd,sssss)格式
$ZDATETIMEH(datetime,dformat,tformat,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt,localeopt)
$ZDTH(datetime,dformat,tformat,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt,localeopt)
参数描述请参考参数解析
可以使用 "T "或 "t "字母代码来指定当前日期。但是,dformat必须是5、6、7、8、9或15。
WRITE $ZDATETIMEH("T",5)
输出:
66107,0
当前日期前三天:
WRITE $ZDATETIMEH("T-3",5)
输出:
66104,0
$ZTIMEZONE : 时区
$ZTIMEZONE是一个从格林威治子午线开始的固定时区偏移量,它不对当地的季节性时间变体进行调整,如夏令时。
代码示例:
w $ZTIMEZONE,!
输出结果为:
-480
文章
姚 鑫 · 五月 18, 2021
# 第四章 使用Setup和tear Down方法执行测试
# 示例:使用Setup和tear Down方法执行测试
以通常的方式执行新的单元测试。
1. 在一直在使用的命名空间中打开终端。
2. 将`^UnitTestRoot`的值设置为包含测试类的目录的父级:
```java
USER> Set ^UnitTestRoot="c:\unittests"
```
3. 使用`%UnitTest.Manager`执行测试:
```jav
USER> Do ##class(%UnitTest.Manager).RunTest("mytests")
```
4. IRIS加载测试类、编译类、执行测试并向终端发送报告。
```java
===============================================================================
Directory: C:\unittests\mytests\cls\MyPackage\
===============================================================================
mytests\cls\MyPackage begins ...
Load of directory started on 01/09/2018 14:36:57 '*.xml;*.XML;*.cls;*.mac;*.int;*.inc;*.CLS;*.MAC;*.INT;*.INC'
Loading file C:\unittests\mytests\cls\MyPackage\Tests.xml as xml
Imported class: MyPackage.Tests
Compilation started on 01/09/2018 15:44:01 with qualifiers ''
Compiling class MyPackage.Tests
Compiling routine MyPackage.Tests.1
Compilation finished successfully in 0.033s.
Load finished successfully.
MyPackage.Tests begins ...
TestAdd() begins ...
AssertEquals:Test Add(2,2)=4 (passed)
AssertNotEquals:Test Add(2,2)'=5 (passed)
LogMessage:Duration of execution: .000073 sec.
TestAdd passed
TestEditContact() begins ...
AssertStatusNotOK:ContactType = Friend (passed)
AssertStatusOK:ContactType = Personal (passed)
LogMessage:Duration of execution: .001227 sec.
TestEditContact passed
MyPackage.Tests passed
mytests\cls\MyPackage passed
Use the following URL to view the result:
http://10.0.75.1:52773/csp/sys/%25UnitTest.Portal.Indices.cls?Index=10&$NAMESPACE=USER
All PASSED
```
# 执行测试的选项:测试规格和限定符
通常,可以使用以下形式的命令执行`RunTest`:
```java
Do ##class(%UnitTest.Manager).RunTest("testspec","qualifiers")
```
`Testspec`参数确定要运行哪些测试以及在哪里可以找到它们。`Testspec`的一般形式是`testSuite:testcase:testmethod`,其中
- `testsuite`(必填)。包含导出的测试类的文件目录。该目录必须是名为`^UnitTestRoot`的目录的子目录。默认情况下,测试管理器执行此目录及其子目录中包含的所有文件中的所有测试。
- `testcase`测试用例(可选)。选择包含要执行的测试方法的单个类。格式为`PackageName.ClassName`。如果存在,则测试管理器仅执行命名类中的测试。
- `testmethod`(可选)。挑选由测试用例指示的测试类的一个方法来执行。
限定符参数指定用于运行测试的各种选项。正如我们已经看到的,当想要从`.cls`文件加载测试时,可以使用`“/loadudl”`限定符。还可以使用限定符来控制测试类在执行后是否从服务器中删除,是否应该从这些外部文件加载测试,或者系统是否应该在测试失败后进入调试模式,等等。限定符参数是一个可选的命令行参数字符串,用于打开或关闭某些测试管理器行为。例如,`“/NoLoad/DEBUG”`告诉管理器不要从目录加载任何测试,也就是说,使用当前在InterSystems IRIS中的测试,并在调试模式下运行测试。这些限定符就是所谓的可否定布尔值。例如,这意味着`“/NoLoad”`等同于`“/Load=0”`。
限定符 | 含义
---|---
`/load` (default) |从目录加载测试。使用`/NoLoad`不加载测试,并执行InterSystems IRIS中已包含的测试。
`/run` (default) |运行测试。使用`/norun`加载但不运行任何测试。
`/delete` (default) |执行后从InterSystems IRIS中删除测试类。使用`/nodelete`保存类。
`/recursive` (default)| 在指定目录的子目录中查找测试。使用`/norecsive`不执行子目录中包含的测试。
`/debug` (default is /nodebug)| 使用/DEBUG,第一次测试失败后不会执行任何测试。从终端执行时,终端将在第一次故障后进入调试模式。
`/autoload` |使用`/autoload=dir`从`^UnitTestRoot`目录的子目录`“dir”`加载测试。
`/loadudl`|从`.cls`而不是`XML`文件加载测试。
# RunTest 示例
以下是使用`RunTest`执行单元测试的一些示例。
要使用`RunTest`,必须首先为`^UnitTestRoot`分配一个有效的目录名:
```java
USER>Set ^UnitTestRoot = "C:\UnitTests"
```
例1:
```java
USER>Do ##class(%UnitTest.Manager).RunTest()
```
在`^UnitTestRoot`目录的所有子目录中搜索包含测试类的XML文件。加载它找到的任何测试类并执行测试。
执行后从InterSystems IRIS中删除所有加载的测试类。
例2:
```java
USER>Do ##class(%UnitTest.Manager).RunTest("mytests")
```
- 加载并执行`^UnitTestRoot`的`mytests`子目录(及其子目录)中的测试。
- 在测试类执行后从InterSystems IRIS中删除它们。
例3:
```java
USER>Do ##class(%UnitTest.Manager).RunTest("mytests:MyPackage.Tests")
```
- 从`^UnitTestRoot`目录的`mytest`子目录(及其子目录)加载测试。仅执行`MyPackage.Tests`中的测试。
- 执行测试后从InterSystems IRIS中删除所有测试类。
例4:
```java
USER>Do ##class(%UnitTest.Manager).RunTest("mytests:MyPackage.Tests", "/noload/nodelete")
```
- 不将测试加载到IRIS。
- 在`MyPackage.Tests`中执行测试。请注意,`mytest`必须仍然包含带有`MyPackage.Tests`类的XML文件。
- 不从IRIS中删除`MyPackage.Tests`。
# DebugRunTestCase
`%UnitTest.Manager`类还包含`DebugRunTestCase`方法。若要使用此方法,仍必须先将`^UnitTestRoot`分配给有效目录:
```java
USER>Set ^UnitTestRoot="C:\UnitTests"
```
例如:
```java
USER>Do ##class(%UnitTest.Manager).DebugRunTestCase("mytests","MyPackage.Tests","","")
```
- 该方法不从任何目录加载任何类,也不从InterSystems IRIS删除任何类。
- 该方法执行`MyPackage.Tests`中包含的测试。
- 可选的第三个参数用于限定符。
- 可选的第四个参数用于指定测试类中要执行的单个测试方法。
- 如果测试失败,该方法将继续执行其余的测试方法,但将在测试完成时中断。因此,如果从终端执行,则终端将进入调试模式。
**注意:使用`DebugRunTestCase`时,`mytest`目录实际上不需要包含`MyPackage.Tests`。相比之下,`RunTest`总是要求要执行的测试包含在`^UnitTestRoot`的子目录中,即使在使用`NoLoad”`时也是如此。**
# 练习
练习1:`MyPackage.TestMe`包含一个名为`CreateContact`的方法。此方法创建并返回`Contact`实例。它接受`Name`和`ContactType`值作为参数。创建一个测试以下内容的单元测试:
- 从`CreateContact`返回的`Contact`实例具有正确的`Name`值。
- 从`CreateContact`返回的`Contact`实例具有正确的`ContactType`值。
- `CreateContact`返回的`Contact`实例保存正确,即`%Save`返回`OK`状态。
练习2:`MyPackage.Contact`包含名为`ByContactType`的类查询。它返回具有`ContactType`指定值的所有`Contact`实例的`ID`值。将单元测试添加到`MyPackages.Tests`,用于测试以下各项:
- 该查询返回指定`ContactType`的正确`ID`值数量。为此,必须正确初始化数据库。
- 查询返回的每个`ID`值对应于一个具有指定`ContactType`值的联系人。
请注意,添加此测试不应破坏在完成教程正文中的示例时添加到`MyPackage.Tests`中的测试。因此,必须以正确的方式初始化和恢复数据库。
> 把答案发到评论上!!! 或加群QQ 410039091 分享
# [源码](https://download.csdn.net/download/yaoxin521123/18703118)
文章
姚 鑫 · 四月 7, 2023
# 第二十一章 配置镜像
本章提供了镜像和镜像成员的设置、配置和管理的相关信息和步骤。
# 镜像的自动部署方法
本章提供了使用管理门户创建镜像和将现有实例配置为成员的过程。 IRIS Data平台还提供了几种自动部署镜像的方法,这些镜像在部署后完全可运行。
## 使用云管理器(ICM)部署镜像
ISC建议使用InterSystems Cloud Manager(ICM)部署 IRIS,包括镜像配置。通过将纯文本声明性配置文件、简单的命令行界面和Docker Containers中的 IRIS部署相结合,ICM为提供了一种简单、直观的方式来配置云或虚拟基础架构,并在该基础架构上部署所需的InterSystems IRIS体系结构以及其他服务。ICM可以显著简化部署流程,尤其是对于复杂的水平群集配置。
除了部署独立的镜像实例外,ICM还可以部署具有镜像数据服务器的分布式缓存集群和具有镜像数据节点的分片集群。
## 使用 Kubernetes运算符(IKO)部署镜像
KUBERNETES一个开源的编排引擎,用于自动部署、扩展和管理容器化的工作负载和服务。可以定义想要部署的容器化服务以及希望它们遵循的策略;Kubernetes以尽可能高效的方式透明地提供所需的资源,在部署偏离规范时修复或恢复部署,并自动或按需扩展。InterSystems Kubernetes运算符(ICO)使用IrisCluster定制资源扩展了Kubernetes API,该资源可以作为InterSystems IRIS分片集群、分布式缓存集群或独立实例部署在任何Kubernetes平台上,所有这些都是可选的镜像。
在Kubernetes下部署 IRIS并不需要ICO,但它极大地简化了过程,并向Kubernetes添加了 IRIS特定的集群管理功能,支持将节点添加到集群等任务,否则您必须通过直接与实例交互来手动完成这些任务。
## 使用配置合并部署镜像
配置合并功能在Linux和UNIX®系统上可用,它允许通过将所需的声明性配置合并文件应用于部署中的每个实例,来改变从相同映像部署的InterSystems IRIS容器的配置,或从相同工具包安装的本地实例的配置。此合并文件也可在重新启动现有实例时应用,它更新实例的配置参数文件(CPF),其中包含其大部分配置设置;这些设置在每次启动时从CPF中读取,包括部署实例后的第一个设置。当在部署期间应用配置合并时,实际上是用自己的更新版本替换了随实例提供的默认CPF。
使用配置合并,可以部署(或从现有实例配置)一个或多个镜像,包括它们的镜像数据库,方法是将单独的合并文件应用到不同的镜像角色,按顺序部署或配置第一个故障切换成员,然后是第二个故障切换成员,然后是灾难恢复异步成员。(部署或配置镜像后,必须手动将报告异步成员添加到镜像中。)。如果部署主机的名称与特定模式匹配,还可以自动部署多个故障转移对,或为现有主映像部署多个备份。在这种情况下,您可以将单个合并文件同时用于主备份和备份,然后在自动部署故障切换对后,对任何灾难恢复异步成员使用单独的合并文件。
还可以使用配置合并功能来部署具有镜像数据服务器的分布式缓存集群和具有镜像数据节点的分片集群。