搜索​​​​

清除过滤器
文章
Hao Ma · 十月 28, 2024

IRIS images的下载和简单的搭建测试环境

### IRIS image下载 [参考:下载Images的在线文档](https://docs.intersystems.com/components/csp/docbook/Doc.View.cls?KEY=PAGE_containerregistry#PAGE_containerregistry) 在网站上获得可以下载的InterSystems的各种docker镜像。如果只是安装Community版本, 不需要注册。如果是下载安装正式的版本,需要在网站注册,然后获得Login Token登陆。 ```zsh #;这一部有可能需要科学上网,否则无法正常登陆 hma@CNMBP23HMA ~ % docker login -u="hma" -p="k8zIqpoafIUaViP2BA4gCZdcC4EeKyb0svSjnyVtcWMb" containers.intersystems.com WARNING! Using --password via the CLI is insecure. Use --password-stdin. Login Succeeded # pull iris image,webgateway,Passhash, arbiter, etc. hma@CNMBP23HMA ~ % docker pull containers.intersystems.com/intersystems/healthconnect-arm64:latest-cd hma@CNMBP23HMA ~ % docker pull containers.intersystems.com/intersystems/webgateway-arm64:latest-cd ... ``` **Tips** - 下载社区(Community)版本的镜像不用在网站注册,使用时也不需要安装license。社区版内置内置了一个13个月的license。而正式版本IRIS Continer安装需要从InterSystems处获得IRIS docker版的专用license。 - 标记`latest-cd(Continuous delivery)`,`latest-em(Extended maintenance)`, `latest-preview`是最新的"持续交付"版本, "扩展维护"版本,以及"开发预览版"。 您也可以选择指定专门的版本,比如当前最新的GA版本2024.2。同时,如果硬件是ARM芯片,请选择带有“-arm64"后缀的版本。 - WebGateway-nginx是nginx服务器的版本,而WebGateway镜像内置了apache2服务。 ### 简单的搭建测试环境 我要使用的iris 2024的版本,其中再没有之前的内置的PWS(Private Web Server), 也就是说您当前以及无法从http://localhost:52773/csp/sys/UtilHome.csp登录管理门户了。因此我用`docker-compose`来创建下面的例子。`docker-compose`用来编排多个container共同工作。它自动的创建一个单独的docker network, 其中的所有service, 也就是docker container可以通过container name通信。 如果是简单的测试环境, 可以直接用`docker run`运行IRIS Container。 我们先来run一个最简单的社区版: **compose.yaml** ```yaml services: iris-a: image: containers.intersystems.com/intersystems/irishealth-community-arm64:2024.2 container_name: iris-a hostname: irisa ports: - 1980:1972 - 52773:52773 environment: - TZ=CST-8 webgateway-apache: image: containers.intersystems.com/intersystems/webgateway-arm64:2024.1 container_name: wg-apache hostname: wg-apache ports: - "8080:80" environment: - TZ=CST-8 ``` 说明两点: 1. 在IRIS2024中52773端口已经无法使用,所以不需要再被映射到主机。 2. TZ=CST-8是把container的时区设置为上海。 运行后可以看到两个container都已经工作 ```zsh hma@CNMBP23HMA demo % docker-compose up -d [+] Running 3/3 ✔ Network demo_default Created 0.0s ✔ Container wg-apache Started 0.0s ✔ Container iris-a Started 0.0s hma@CNMBP23HMA demo % docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cfa4cc730c14 containers.intersystems.com/intersystems/irishealth-community-arm64:2024.2 "/tini -- /iris-main" 6 seconds ago Up 5 seconds 2188/tcp, 52773/tcp, 53773/tcp, 54773/tcp, 0.0.0.0:1980->1972/tcp iris-a 63e983d90034 containers.intersystems.com/intersystems/webgateway-arm64:2024.1 "/startWebGateway" 6 seconds ago Up 5 seconds 0.0.0.0:8080->80/tcp, 0.0.0.0:4433->443/tcp wg-apache hma@CNMBP23HMA demo % ``` #### **查看iris container** 这时,虽然还无法登录iris的管理门户,您可以使用docker exec进入iris container查看iris实例已运行。 注意两点: 1. 默认登录的用户是irisowner 2. IRIS的安装路径是`/usr/irissys`. ```zsh hma@CNMBP23HMA installer_cch % docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 59e2424757db containers.intersystems.com/intersystems/irishealth-arm64:2024.1 "/tini -- /iris-main" 6 seconds ago Up 5 seconds 0.0.0.0:1972->1972/tcp, 2188/tcp, 53773/tcp, 0.0.0.0:52773->52773/tcp, 54773/tcp iris hma@CNMBP23HMA installer_cch % docker exec -it iris bash irisowner@59e2424757db:~$ iris list Configuration 'IRIS' (default) directory: /usr/irissys versionid: 2024.1.0.263.0 datadir: /usr/irissys conf file: iris.cpf status: running, since Wed Oct 23 12:32:45 2024 SuperServers: 1972 state: warn product: InterSystems IRISHealth irisowner@59e2424757db:~$ iris session iris Node: 59e2424757db, Instance: IRIS USER>halt irisowner@59e2424757db:~$ ``` #### 查看Webgateway Container 1. 从浏览器打开 http://localhost:8080, 可以看到apache2的主页面。 2. 访问http://localhost:8080/csp/bin/Systems/Module.cxw?CSPSYS=0&CSPSYSreferer=_CSP.Portal.Home.zen,可以进入Webgateway的配置页面。 这里一定注意:访问http://localhost:8080/csp/bin/Systems/Module.cxw会得到500错误。当前状态下一定要带着参数访问这个网址。 3. 配置webgateway到iris的连接:在当前页面,你需要设置。 - Server Local的IP/DNS和Port:这里是iris container的名字iris-a,和iris-a container的superserver端口1972 - 登录iris的账户密码:CSPSystem, SYS 保存设置,然后在"Test Server Connection"页面测试连接,你将看到连接成功的结果。 4. 尽量webgateway已经成功连接了IRIS, 但配置还没有完。要成功访问IRIS管理页面,你需要修改一个apache2的配置文件CSP.conf - 使用`docker exec -it wg-apache bash`进入container. - 修改`/etc/apache2/mods-available/CSP.conf`配置文件,如下: ```bash # 原始文件的内容 CSPModulePath "${ISC_PACKAGE_INSTALLDIR}/bin/" CSPConfigPath "${ISC_PACKAGE_INSTALLDIR}/bin/" SetHandler csp-handler-sa SetHandler csp-handler-sa AllowOverride None Options None Require all granted Require all denied # 自己添加的内容 CSP On CSP On CSP On ``` - 用命令行`service apache2 restart`重启apache2, 或者从container里退出重启wg-apache container. - 从浏览器访问http://localhost:8080/csp/sys/UtilHome.csp, 您应该已经可以成功访问IRIS了。 ### 总结 虽然题目是'简单的搭建测试环境', 但实际上还是有非常多的步骤,主要是集中在webgateway到IRIS的连接上。 如果您熟悉docker-compose,您知道这样人工的配置一个container是不合适的。而后面的章节我会专门有一章节如何在docker-compose里自动配置webgateway。之所以还要介绍webgateway的人工配置步骤,是因为这些知识是自动配置webgateway的背景知识,而且在做debug时非常关键。 另外,后面我还会介绍webgateay-nginx的配置。
文章
Jingwei Wang · 九月 27, 2021

IRIS 2021 技术文档 First Look 21 数据弹性(恢复、高可用与灾备)和镜像

html {overflow-x: initial !important;}:root { --bg-color: #ffffff; --text-color: #333333; --select-text-bg-color: #B5D6FC; --select-text-font-color: auto; --monospace: "Lucida Console",Consolas,"Courier",monospace; --title-bar-height: 20px; } .mac-os-11 { --title-bar-height: 28px; } html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; } body { margin: 0px; padding: 0px; height: auto; inset: 0px; font-size: 1rem; line-height: 1.42857143; overflow-x: hidden; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; tab-size: 4; background-position: inherit; background-repeat: inherit; } iframe { margin: auto; } a.url { word-break: break-all; } a:active, a:hover { outline: 0px; } .in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); } #write { margin: 0px auto; height: auto; width: inherit; word-break: normal; word-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 36px; } #write.first-line-indent p { text-indent: 2em; } #write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; } #write.first-line-indent li { margin-left: 2em; } .for-image #write { padding-left: 8px; padding-right: 8px; } body.typora-export { padding-left: 30px; padding-right: 30px; } .typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; } .typora-export .task-list-item input { pointer-events: none; } @media screen and (max-width: 500px) { body.typora-export { padding-left: 0px; padding-right: 0px; } #write { padding-left: 20px; padding-right: 20px; } .CodeMirror-sizer { margin-left: 0px !important; } .CodeMirror-gutters { display: none !important; } } #write li > figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max-width: 100%; vertical-align: middle; image-orientation: from-image; } button, input, select, textarea { color: inherit; font-family: inherit; font-size: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; } input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; } *, ::after, ::before { box-sizing: border-box; } #write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; } #write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; } p { line-height: inherit; } h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 4; } p { orphans: 4; } h1 { font-size: 2rem; } h2 { font-size: 1.8rem; } h3 { font-size: 1.6rem; } h4 { font-size: 1.4rem; } h5 { font-size: 1.2rem; } h6 { font-size: 1rem; } .md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; } .hidden { display: none; } .md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; } a { cursor: pointer; } sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; cursor: pointer; } sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; } #write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; } figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; } figure > table { margin: 0px; } tr { break-inside: avoid; break-after: auto; } thead { display: table-header-group; } table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; } table.md-table td { min-width: 32px; } .CodeMirror-gutters { border-right-width: 0px; background-color: inherit; } .CodeMirror-linenumber { } .CodeMirror { text-align: left; } .CodeMirror-placeholder { opacity: 0.3; } .CodeMirror pre { padding: 0px 4px; } .CodeMirror-lines { padding: 0px; } div.hr:focus { cursor: none; } #write pre { white-space: pre-wrap; } #write.fences-no-line-wrapping pre { white-space: pre; } #write pre.ty-contain-cm { white-space: normal; } .CodeMirror-gutters { margin-right: 4px; } .md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; position: relative !important; background-position: inherit; background-repeat: inherit; } .md-fences-adv-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; } #write .md-fences.mock-cm { white-space: pre-wrap; } .md-fences.md-fences-with-lineno { padding-left: 0px; } #write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; } .md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; } .CodeMirror-line, twitterwidget { break-inside: avoid; } .footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; } .footnotes + .footnotes { margin-top: 0px; } .md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; background-position: 0px 0px; } li div { padding-top: 0px; } blockquote { margin: 1rem 0px; } li .mathjax-block, li p { margin: 0.5rem 0px; } li blockquote { margin: 1rem 0px; } li { margin: 0px; position: relative; } blockquote > :last-child { margin-bottom: 0px; } blockquote > :first-child, li > :first-child { margin-top: 0px; } .footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; } #write .footnote-line { white-space: pre-wrap; } @media print { body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; } #write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; } .typora-export * { -webkit-print-color-adjust: exact; } .typora-export #write { break-after: avoid; } .typora-export #write::after { height: 0px; } .is-mac table { break-inside: avoid; } .typora-export-show-outline .typora-export-sidebar { display: none; } } .footnote-line { margin-top: 0.714em; font-size: 0.7em; } a img, img a { cursor: pointer; } pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background-color: rgb(204, 204, 204); display: block; overflow-x: hidden; } p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; } #write.first-line-indent p > .md-image:only-child:not(.md-img-error) img { left: -2em; position: relative; } p > .md-image:only-child { display: inline-block; width: 100%; } #write .MathJax_Display { margin: 0.8em 0px 0px; } .md-math-block { width: 100%; } .md-math-block:not(:empty)::after { display: none; } .MathJax_ref { fill: currentcolor; } [contenteditable="true"]:active, [contenteditable="true"]:focus, [contenteditable="false"]:active, [contenteditable="false"]:focus { outline: 0px; box-shadow: none; } .md-task-list-item { position: relative; list-style-type: none; } .task-list-item.md-task-list-item { padding-left: 0px; } .md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; } .math { font-size: 1rem; } .md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-top-left-radius: 10px; border-top-right-radius: 10px; border-bottom-right-radius: 10px; border-bottom-left-radius: 10px; } .md-toc-content { position: relative; margin-left: 0px; } .md-toc-content::after, .md-toc::after { display: none; } .md-toc-item { display: block; color: rgb(65, 131, 196); } .md-toc-item a { text-decoration: none; } .md-toc-inner:hover { text-decoration: underline; } .md-toc-inner { display: inline-block; cursor: pointer; } .md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; } .md-toc-h2 .md-toc-inner { margin-left: 2em; } .md-toc-h3 .md-toc-inner { margin-left: 4em; } .md-toc-h4 .md-toc-inner { margin-left: 6em; } .md-toc-h5 .md-toc-inner { margin-left: 8em; } .md-toc-h6 .md-toc-inner { margin-left: 10em; } @media screen and (max-width: 48em) { .md-toc-h3 .md-toc-inner { margin-left: 3.5em; } .md-toc-h4 .md-toc-inner { margin-left: 5em; } .md-toc-h5 .md-toc-inner { margin-left: 6.5em; } .md-toc-h6 .md-toc-inner { margin-left: 8em; } } a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; } .footnote-line a:not(.reversefootnote) { color: inherit; } .md-attr { display: none; } .md-fn-count::after { content: "."; } code, pre, samp, tt { font-family: var(--monospace); } kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background-color: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; } .md-comment { color: rgb(162, 127, 3); opacity: 0.8; font-family: var(--monospace); } code { text-align: left; } a.md-print-anchor { white-space: pre !important; border: none !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; text-shadow: initial !important; background-position: 0px 0px !important; } .md-inline-math .MathJax_SVG .noError { display: none !important; } .html-for-mac .inline-math-svg .MathJax_SVG { vertical-align: 0.2px; } .md-fences-math .MathJax_SVG_Display, .md-math-block .MathJax_SVG_Display { text-align: center; margin: 0px; position: relative; text-indent: 0px; max-width: none; max-height: none; min-height: 0px; min-width: 100%; width: auto; overflow-y: visible; display: block !important; } .MathJax_SVG_Display, .md-inline-math .MathJax_SVG_Display { width: auto; margin: inherit; display: inline-block !important; } .MathJax_SVG .MJX-monospace { font-family: var(--monospace); } .MathJax_SVG .MJX-sans-serif { font-family: sans-serif; } .MathJax_SVG { display: inline; font-style: normal; font-weight: 400; line-height: normal; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; zoom: 90%; } #math-inline-preview-content { zoom: 1.1; } .MathJax_SVG * { transition: none; } .MathJax_SVG_Display svg { vertical-align: middle !important; margin-bottom: 0px !important; margin-top: 0px !important; } .os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; } .md-diagram-panel > svg { max-width: 100%; } [lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; height: auto; } [lang="mermaid"] .node text { font-size: 1rem; } table tr th { border-bottom-width: 0px; } video { max-width: 100%; display: block; margin: 0px auto; } iframe { max-width: 100%; width: 100%; border: none; } .highlight td, .highlight tr { border: 0px; } mark { background-color: rgb(255, 255, 0); color: rgb(0, 0, 0); } .md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; } .md-expand mark .md-meta { opacity: 0.3 !important; } mark .md-meta { color: rgb(0, 0, 0); } @media print { .typora-export h1, .typora-export h2, .typora-export h3, .typora-export h4, .typora-export h5, .typora-export h6 { break-inside: avoid; } } .md-diagram-panel .messageText { stroke: none !important; } .md-diagram-panel .start-state { fill: var(--node-fill); } .md-diagram-panel .edgeLabel rect { opacity: 1 !important; } .md-require-zoom-fix foreignObject { font-size: var(--mermaid-font-zoom); } .md-fences.md-fences-math { font-size: 1em; } .md-fences-math .MathJax_SVG_Display { margin-top: 8px; cursor: default; } .md-fences-advanced:not(.md-focus) { padding: 0px; white-space: nowrap; border: 0px; } .md-fences-advanced:not(.md-focus) { background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; background-position: inherit; background-repeat: inherit; } .typora-export-show-outline .typora-export-content { max-width: 1440px; margin: auto; display: flex; flex-direction: row; } .typora-export-sidebar { width: 300px; font-size: 0.8rem; margin-top: 80px; margin-right: 18px; } .typora-export-show-outline #write { --webkit-flex: 2; flex: 2 1 0%; } .typora-export-sidebar .outline-content { position: fixed; top: 0px; max-height: 100%; overflow: hidden auto; padding-bottom: 30px; padding-top: 60px; width: 300px; } @media screen and (max-width: 1024px) { .typora-export-sidebar, .typora-export-sidebar .outline-content { width: 240px; } } @media screen and (max-width: 800px) { .typora-export-sidebar { display: none; } } .outline-content li, .outline-content ul { margin-left: 0px; margin-right: 0px; padding-left: 0px; padding-right: 0px; list-style: none; } .outline-content ul { margin-top: 0px; margin-bottom: 0px; } .outline-content strong { font-weight: 400; } .outline-expander { width: 1rem; height: 1.428571429rem; position: relative; display: table-cell; vertical-align: middle; cursor: pointer; padding-left: 4px; } .outline-expander::before { content: ''; position: relative; font-family: Ionicons; display: inline-block; font-size: 8px; vertical-align: middle; } .outline-item { padding-top: 3px; padding-bottom: 3px; cursor: pointer; } .outline-expander:hover::before { content: ''; } .outline-h1 > .outline-item { padding-left: 0px; } .outline-h2 > .outline-item { padding-left: 1em; } .outline-h3 > .outline-item { padding-left: 2em; } .outline-h4 > .outline-item { padding-left: 3em; } .outline-h5 > .outline-item { padding-left: 4em; } .outline-h6 > .outline-item { padding-left: 5em; } .outline-label { cursor: pointer; display: table-cell; vertical-align: middle; text-decoration: none; color: inherit; } .outline-label:hover { text-decoration: underline; } .outline-item:hover { border-color: rgb(245, 245, 245); background-color: var(--item-hover-bg-color); } .outline-item:hover { margin-left: -28px; margin-right: -28px; border-left-width: 28px; border-left-style: solid; border-left-color: transparent; border-right-width: 28px; border-right-style: solid; border-right-color: transparent; } .outline-item-single .outline-expander::before, .outline-item-single .outline-expander:hover::before { display: none; } .outline-item-open > .outline-item > .outline-expander::before { content: ''; } .outline-children { display: none; } .info-panel-tab-wrapper { display: none; } .outline-item-open > .outline-children { display: block; } .typora-export .outline-item { padding-top: 1px; padding-bottom: 1px; } .typora-export .outline-item:hover { margin-right: -8px; border-right-width: 8px; border-right-style: solid; border-right-color: transparent; } .typora-export .outline-expander::before { content: "+"; font-family: inherit; top: -1px; } .typora-export .outline-expander:hover::before, .typora-export .outline-item-open > .outline-item > .outline-expander::before { content: '−'; } .typora-export-collapse-outline .outline-children { display: none; } .typora-export-collapse-outline .outline-item-open > .outline-children, .typora-export-no-collapse-outline .outline-children { display: block; } .typora-export-no-collapse-outline .outline-expander::before { content: "" !important; } .typora-export-show-outline .outline-item-active > .outline-item .outline-label { font-weight: 700; } .CodeMirror { height: auto; } .CodeMirror.cm-s-inner { background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; background-position: inherit; background-repeat: inherit; } .CodeMirror-scroll { overflow: auto hidden; z-index: 3; } .CodeMirror-gutter-filler, .CodeMirror-scrollbar-filler { background-color: rgb(255, 255, 255); } .CodeMirror-gutters { border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; white-space: nowrap; background-position: inherit; background-repeat: inherit; } .CodeMirror-linenumber { padding: 0px 3px 0px 5px; text-align: right; color: rgb(153, 153, 153); } .cm-s-inner .cm-keyword { color: rgb(119, 0, 136); } .cm-s-inner .cm-atom, .cm-s-inner.cm-atom { color: rgb(34, 17, 153); } .cm-s-inner .cm-number { color: rgb(17, 102, 68); } .cm-s-inner .cm-def { color: rgb(0, 0, 255); } .cm-s-inner .cm-variable { color: rgb(0, 0, 0); } .cm-s-inner .cm-variable-2 { color: rgb(0, 85, 170); } .cm-s-inner .cm-variable-3 { color: rgb(0, 136, 85); } .cm-s-inner .cm-string { color: rgb(170, 17, 17); } .cm-s-inner .cm-property { color: rgb(0, 0, 0); } .cm-s-inner .cm-operator { color: rgb(152, 26, 26); } .cm-s-inner .cm-comment, .cm-s-inner.cm-comment { color: rgb(170, 85, 0); } .cm-s-inner .cm-string-2 { color: rgb(255, 85, 0); } .cm-s-inner .cm-meta { color: rgb(85, 85, 85); } .cm-s-inner .cm-qualifier { color: rgb(85, 85, 85); } .cm-s-inner .cm-builtin { color: rgb(51, 0, 170); } .cm-s-inner .cm-bracket { color: rgb(153, 153, 119); } .cm-s-inner .cm-tag { color: rgb(17, 119, 0); } .cm-s-inner .cm-attribute { color: rgb(0, 0, 204); } .cm-s-inner .cm-header, .cm-s-inner.cm-header { color: rgb(0, 0, 255); } .cm-s-inner .cm-quote, .cm-s-inner.cm-quote { color: rgb(0, 153, 0); } .cm-s-inner .cm-hr, .cm-s-inner.cm-hr { color: rgb(153, 153, 153); } .cm-s-inner .cm-link, .cm-s-inner.cm-link { color: rgb(0, 0, 204); } .cm-negative { color: rgb(221, 68, 68); } .cm-positive { color: rgb(34, 153, 34); } .cm-header, .cm-strong { font-weight: 700; } .cm-del { text-decoration: line-through; } .cm-em { font-style: italic; } .cm-link { text-decoration: underline; } .cm-error { color: red; } .cm-invalidchar { color: red; } .cm-constant { color: rgb(38, 139, 210); } .cm-defined { color: rgb(181, 137, 0); } div.CodeMirror span.CodeMirror-matchingbracket { color: rgb(0, 255, 0); } div.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgb(255, 34, 34); } .cm-s-inner .CodeMirror-activeline-background { background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; background-position: inherit; background-repeat: inherit; } .CodeMirror { position: relative; overflow: hidden; } .CodeMirror-scroll { height: 100%; outline: 0px; position: relative; box-sizing: content-box; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; background-position: inherit; background-repeat: inherit; } .CodeMirror-sizer { position: relative; } .CodeMirror-gutter-filler, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-vscrollbar { position: absolute; z-index: 6; display: none; } .CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden; } .CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: hidden; } .CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; } .CodeMirror-gutter-filler { left: 0px; bottom: 0px; } .CodeMirror-gutters { position: absolute; left: 0px; top: 0px; padding-bottom: 30px; z-index: 3; } .CodeMirror-gutter { white-space: normal; height: 100%; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; } .CodeMirror-gutter-wrapper { position: absolute; z-index: 4; border: none !important; background-position: 0px 0px !important; } .CodeMirror-gutter-background { position: absolute; top: 0px; bottom: 0px; z-index: 4; } .CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; } .CodeMirror-lines { cursor: text; } .CodeMirror pre { border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; border-width: 0px; font-family: inherit; font-size: inherit; margin: 0px; white-space: pre; word-wrap: normal; color: inherit; z-index: 2; position: relative; overflow: visible; background-position: 0px 0px; } .CodeMirror-wrap pre { word-wrap: break-word; white-space: pre-wrap; word-break: normal; } .CodeMirror-code pre { border-right-width: 30px; border-right-style: solid; border-right-color: transparent; width: fit-content; } .CodeMirror-wrap .CodeMirror-code pre { border-right-style: none; width: auto; } .CodeMirror-linebackground { position: absolute; inset: 0px; z-index: 0; } .CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; } .CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; } .CodeMirror-measure { position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden; } .CodeMirror-measure pre { position: static; } .CodeMirror div.CodeMirror-cursor { position: absolute; visibility: hidden; border-right-style: none; width: 0px; } .CodeMirror div.CodeMirror-cursor { visibility: hidden; } .CodeMirror-focused div.CodeMirror-cursor { visibility: inherit; } .cm-searching { background-color: rgba(255, 255, 0, 0.4); } span.cm-underlined { text-decoration: underline; } span.cm-strikethrough { text-decoration: line-through; } .cm-tw-syntaxerror { color: rgb(255, 255, 255); background-color: rgb(153, 0, 0); } .cm-tw-deleted { text-decoration: line-through; } .cm-tw-header5 { font-weight: 700; } .cm-tw-listitem:first-child { padding-left: 10px; } .cm-tw-box { border-style: solid; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-color: inherit; border-top-width: 0px !important; } .cm-tw-underline { text-decoration: underline; } @media print { .CodeMirror div.CodeMirror-cursor { visibility: hidden; } } :root { --side-bar-bg-color: #fafafa; --control-text-color: #777; } @include-when-export url(https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext); /* open-sans-regular - latin-ext_latin */ /* open-sans-italic - latin-ext_latin */ /* open-sans-700 - latin-ext_latin */ /* open-sans-700italic - latin-ext_latin */ html { font-size: 16px; } body { font-family: "Open Sans","Clear Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; color: rgb(51, 51, 51); line-height: 1.6; } #write { max-width: 860px; margin: 0 auto; padding: 30px; padding-bottom: 100px; } @media only screen and (min-width: 1400px) { #write { max-width: 1024px; } } @media only screen and (min-width: 1800px) { #write { max-width: 1200px; } } #write > ul:first-child, #write > ol:first-child{ margin-top: 30px; } a { color: #4183C4; } h1, h2, h3, h4, h5, h6 { position: relative; margin-top: 1rem; margin-bottom: 1rem; font-weight: bold; line-height: 1.4; cursor: text; } h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor { text-decoration: none; } h1 tt, h1 code { font-size: inherit; } h2 tt, h2 code { font-size: inherit; } h3 tt, h3 code { font-size: inherit; } h4 tt, h4 code { font-size: inherit; } h5 tt, h5 code { font-size: inherit; } h6 tt, h6 code { font-size: inherit; } h1 { font-size: 2.25em; line-height: 1.2; border-bottom: 1px solid #eee; } h2 { font-size: 1.75em; line-height: 1.225; border-bottom: 1px solid #eee; } /*@media print { .typora-export h1, .typora-export h2 { border-bottom: none; padding-bottom: initial; } .typora-export h1::after, .typora-export h2::after { content: ""; display: block; height: 100px; margin-top: -96px; border-top: 1px solid #eee; } }*/ h3 { font-size: 1.5em; line-height: 1.43; } h4 { font-size: 1.25em; } h5 { font-size: 1em; } h6 { font-size: 1em; color: #777; } p, blockquote, ul, ol, dl, table{ margin: 0.8em 0; } li>ol, li>ul { margin: 0 0; } hr { height: 2px; padding: 0; margin: 16px 0; background-color: #e7e7e7; border: 0 none; overflow: hidden; box-sizing: content-box; } li p.first { display: inline-block; } ul, ol { padding-left: 30px; } ul:first-child, ol:first-child { margin-top: 0; } ul:last-child, ol:last-child { margin-bottom: 0; } blockquote { border-left: 4px solid #dfe2e5; padding: 0 15px; color: #777777; } blockquote blockquote { padding-right: 0; } table { padding: 0; word-break: initial; } table tr { border: 1px solid #dfe2e5; margin: 0; padding: 0; } table tr:nth-child(2n), thead { background-color: #f8f8f8; } table th { font-weight: bold; border: 1px solid #dfe2e5; border-bottom: 0; margin: 0; padding: 6px 13px; } table td { border: 1px solid #dfe2e5; margin: 0; padding: 6px 13px; } table th:first-child, table td:first-child { margin-top: 0; } table th:last-child, table td:last-child { margin-bottom: 0; } .CodeMirror-lines { padding-left: 4px; } .code-tooltip { box-shadow: 0 1px 1px 0 rgba(0,28,36,.3); border-top: 1px solid #eef2f2; } .md-fences, code, tt { border: 1px solid #e7eaed; background-color: #f8f8f8; border-radius: 3px; padding: 0; padding: 2px 4px 0px 4px; font-size: 0.9em; } code { background-color: #f3f4f4; padding: 0 2px 0 2px; } .md-fences { margin-bottom: 15px; margin-top: 15px; padding-top: 8px; padding-bottom: 6px; } .md-task-list-item > input { margin-left: -1.3em; } @media print { html { font-size: 13px; } table, pre { page-break-inside: avoid; } pre { word-wrap: break-word; } } .md-fences { background-color: #f8f8f8; } #write pre.md-meta-block { padding: 1rem; font-size: 85%; line-height: 1.45; background-color: #f7f7f7; border: 0; border-radius: 3px; color: #777777; margin-top: 0 !important; } .mathjax-block>.code-tooltip { bottom: .375rem; } .md-mathjax-midline { background: #fafafa; } #write>h3.md-focus:before{ left: -1.5625rem; top: .375rem; } #write>h4.md-focus:before{ left: -1.5625rem; top: .285714286rem; } #write>h5.md-focus:before{ left: -1.5625rem; top: .285714286rem; } #write>h6.md-focus:before{ left: -1.5625rem; top: .285714286rem; } .md-image>.md-meta { /*border: 1px solid #ddd;*/ border-radius: 3px; padding: 2px 0px 0px 4px; font-size: 0.9em; color: inherit; } .md-tag { color: #a7a7a7; opacity: 1; } .md-toc { margin-top:20px; padding-bottom:20px; } .sidebar-tabs { border-bottom: none; } #typora-quick-open { border: 1px solid #ddd; background-color: #f8f8f8; } #typora-quick-open-item { background-color: #FAFAFA; border-color: #FEFEFE #e5e5e5 #e5e5e5 #eee; border-style: solid; border-width: 1px; } /** focus mode */ .on-focus-mode blockquote { border-left-color: rgba(85, 85, 85, 0.12); } header, .context-menu, .megamenu-content, footer{ font-family: "Segoe UI", "Arial", sans-serif; } .file-node-content:hover .file-node-icon, .file-node-content:hover .file-node-open-state{ visibility: visible; } .mac-seamless-mode #typora-sidebar { background-color: #fafafa; background-color: var(--side-bar-bg-color); } .md-lang { color: #b4654d; } /*.html-for-mac { --item-hover-bg-color: #E6F0FE; }*/ #md-notification .btn { border: 0; } .dropdown-menu .divider { border-color: #e5e5e5; opacity: 0.4; } .ty-preferences .window-content { background-color: #fafafa; } .ty-preferences .nav-group-item.active { color: white; background: #999; } .menu-item-container a.menu-style-btn { background-color: #f5f8fa; background-image: linear-gradient( 180deg , hsla(0, 0%, 100%, 0.8), hsla(0, 0%, 100%, 0)); } :root {--mermaid-font-zoom:1em ;} @media print { @page {margin: 0 0 0 0;} body.typora-export {padding-left: 0; padding-right: 0;} #write {padding:0;}} 目录技术概要:数据弹性和镜像数据弹性(Data Resiliency):InterSystems IRIS 提供什么数据弹性(Data Resiliency):InterSystems IRIS 如何提供写入映像日志(Write Image Journaling):防止物理数据损坏和丢失 日志(Journaling):防止逻辑数据损坏和丢失 镜像(Mirroring):高可用性和灾备解决方案 镜像虚拟化平台使用InterSystems IRIS镜像一个数据库:试一试了解有关 InterSystems 数据弹性的更多信息技术概要:数据弹性和镜像本技术概要(First Look)将向您介绍InterSystems IRIS®数据平台的数据弹性(data resiliency)功能。数据弹性包括三个目标------崩溃恢复、高可用性和灾备------这些都是通过 InterSystems IRIS 的几个功能实现的。InterSystems IRIS 的主要功能之一是能够利用逻辑数据复制提供对数据的连续和不间断访问。数据可以同步复制,以允许在各种故障情况下自动故障转移而不会丢失数据,无论是计划内的(例如软件升级)还是计划外的(例如硬件故障)。同步复制数据需要两个节点之间低延迟,因此并不总是适用于跨国家传输数据的灾备(DR)场景。对于这些场景,InterSystems IRIS 提供了内置的异步数据复制。InterSystems IRIS 的镜像功能提供了高可用性。在了解了 InterSystems IRIS 数据弹性后,您将创建一个镜像(mirror),在主成员上进行数据更改,并自动同步复制到备份成员上,然后关闭主成员,使镜像故障转移到备份上。这些活动只使用默认设置,因此您可以熟悉这些功能的基本原理。有关完整的文档,请参见 InterSystems IRIS Data Integrity Guide(《InterSystems IRIS 数据完整性指南》)。[]{#1_Data_Resiliency:_What_InterSystems_IRI .anchor}要浏览所有的技术概要(First Looks),包括那些可以在免费的云实例或 web 实例上执行的技术概要(First Looks),请参见InterSystems 技术概要。数据弹性(Data Resiliency):InterSystems IRIS 提供什么数据弹性涵盖多个主题,但它们都围绕着一个原则:一旦数据被记录在数据平台上,无论发生什么,它都是可以访问的。为了实现这一目标,有几个不同的地方需要解决:即使在发生错误或电源故障的情况下,也能保证数据的有效性从 InterSystems IRIS 服务器的本地故障中进行崩溃恢复,无论是物理故障还是软件相关的故障。防止全站点灾难(断电、网络问题等。)为了满足这些要求,InterSystems IRIS 提供了:结构化数据库完整性(磁盘上数据库块的内容)和防止内部完整性故障(数据库中表示的数据)通过事务处理、锁定和自动回滚实现逻辑数据库完整性内置的高可用性解决方案,具有自动故障转移功能逻辑数据复制,最大限度地降低了结转物理损坏的风险,并且不依赖共享资源计划内和计划外停机的解决方案通过地理上分散的灾难恢复配置带来业务连续性优势InterSystems IRIS 数据弹性全天候保护您生产系统上的数据。数据弹性:InterSystems IRIS 如何提供数据弹性(Data Resiliency):InterSystems IRIS 如何提供系统停机的成本从数千美元到数百万美元不等,具体取决于停机的类型和时间长度以及受影响的系统类型。从停机中快速恢复固然很重要,但恢复数据并确保您的数据不会丢失和损坏的能力也很重要。InterSystems IRIS 写入映像日志技术(write image journaling technology)提供结构化数据库的完整性(磁盘上数据库块的内容),并防止由于系统崩溃而导致的内部完整性故障(数据库中表示的数据)。InterSystems IRIS 备份和日志系统提供物理完整性故障的快速恢复。数据弹性通过事务处理[]{#2.1_Write_Image_Journaling:_Protection_A .anchor}、锁定和自动回滚确保逻辑数据库完整性。除了日志提供的功能外,InterSystems IRIS 还允许您对数据库进行镜像,以提供快速、高效的数据复制和灾难恢复。写入映像日志(Write Image Journaling):防止物理数据损坏和丢失 任何突然的、意外的磁盘或计算机操作中断都可能在第一个数据块(block)被写入后但在最后一个数据块(block)被更新前停止对多个数据库块的更新。其后果可能与数据库完全不可用一样严重,所有数据都无法通过正常方式恢复。 InterSystems IRIS 写入映像日记技术(Write image journaling,WIJ)可以防止这种数据损坏。它可以防止不完整的更新导致不一致的数据库结构。写入映像日志(WIJ)通过使用两阶段(two-phase)方法来保护数据库更新。InterSystems IRIS 实例首先将更新从内存写入过渡日志,即 IRIS.WIJ 文件,然后再写入数据库。如果系统在第一阶段崩溃,则删除更新而不对数据库进行任何更改;如果崩溃发生在第二阶段,您可以在恢复时重新应用写入映像日志(WIJ)的更新,确保对数据库进行所有更新。写入守护进程(The write daemon)在 InterSystems IRIS 启动时创建写入映像日志(WIJ)文件,并在将数据库更新写入 InterSystems IRIS 数据库之前记录 WIJ 中的数据库更新。一旦它输入对 WIJ 的所有更新,它就在文件中设置一个标志,第二阶段开始,写入守护进程将 WIJ 中记录的同一组块写入磁盘上的数据库中。当第二阶段完成时,写入守护进程在 WIJ 中设置一个标志,表示它已被删除。当 InterSystems IRIS 启动时,它会自动检查 WIJ,并在检测到发生异常关机时运行恢复程序。当该程序成功完成时,将恢复数据库的内部完整性。InterSystems IRIS 还在关机后运行 WIJ 恢复作为安全预防措施,以确保数据可以安全备份。根据 WIJ 在两阶段(two-phase)写入协议进程中的位置,恢复执行以下操作:如果崩溃发生在对 WIJ 的最后一次更新完成之后,但在对数据库的相应更新完成之前,那么 WIJ 将被恢复。如果崩溃发生在最后一次 WIJ 更新被持久地写入数据库之后,则会在最近的 WIJ 更新和受影响的数据库之间进行块比较。日志(Journaling):防止逻辑数据损坏和丢失 日志(Journaling)是一个可以在每个数据库基础上启用的功能,它提供所有数据库修改的完整记录。在发生崩溃的情况下,可以在恢复备份之后,从日志中重新应用自最近备份以来所做的更新,以使数据库恢复到发生崩溃的点。InterSystems IRIS 恢复过程通过使用"前滚"的方法提供最大程度的保护。如果发生系统崩溃,恢复机制将完成正在进行的更新。它还保护了更新的顺序;如果恢复后数据库中存在一个更新,那么之前的所有更新也都存在。这可以保护数据弹性:InterSystems IRIS 如何提供增量备份文件结构以及数据库。您可以在崩溃恢复后运行有效的增量备份。日志是数据弹性的第三个功能:镜像的基础。镜像(Mirroring):高可用性和灾备解决方案 InterSystems IRIS 镜像(Mirroring)属于系统可用性策略中的自动故障转移类别。镜像为数据库的可用性提供了全面、可靠和强健的企业解决方案。依赖共享资源(如共享磁盘)的传统可用性解决方案往往容易受到与该共享资源有关的单点故障的影响。镜像通过在主镜像成员和备份镜像成员上维护独立的资源来降低这种风险。此外,通过使用逻辑数据复制,镜像避免了与物理复制技术(如基于 SAN 的复制)相关的风险,包括无序更新和结转损坏。InterSystems IRIS 为高可用性镜像提供了两个选项:镜像(Mirroring)和虚拟化(Virtualization)。镜像具有自动故障转移功能的 InterSystems IRIS 镜像依赖于完全独立系统之间的逻辑数据复制。这避免了在为多个系统使用共享存储时出现单点故障的风险。它还确保在所有故障场景(系统、存储和网络)中,生产系统可以立即将故障转移到备用 InterSystems IRIS 实例。在 InterSystems IRIS 镜像中,一个被称为主故障转移成员的 InterSystems IRIS 实例,提供对生产数据库的访问。另一台主机上的另一个实例(称之为备份故障转移成员),与主服务器同步通信,检索主服务器的日志记录,确认收到日志记录,并将它们应用到同一数据库的自己的副本上。通过这种方式,主服务器和备份服务器总是知道备份服务器是否拥有来自主服务器的最新日志文件,因此可以精确地将其数据库与主服务器上的数据库进行同步。InterSystems IRIS 镜像的另一大功能是允许配置一个特殊的异步成员,它可以从整个企业的多个镜像中接收更新。您可以为单个镜像的灾备配置一个异步成员,这允许它在需要时无缝地替代一个故障转移成员的位置。一个镜像最多可以包括 16 个成员,这使您可以配置多个地理上分散的 灾备(DR) 异步成员。这种模式为分布式数据复制提供了一个强健的框架,从而确保业务连续性有利于组织。另一个好处是,使用异步成员的镜像允许单个系统充当全面的企业数据仓库。这为您提供了企业范围内的数据挖掘和业务智能。虚拟化平台虚拟化平台通常提供 高可用(HA) 功能,这些功能通常监视客户操作系统和运行它的硬件的状态。在虚拟化环境中使用镜像,构成镜像的 InterSystems IRIS 实例安装在虚拟主机上,创造了一个混合的高可用性解决方案,结合了镜像和虚拟化的优势。虽然镜像通过自动故障转移对计划内或计划外的故障提供即时响应,但虚拟化 HA 软件在计划外的机器或 OS 故障后自动重新启动托管镜像成员的虚拟机。这允许失败的成员快速重新加入镜像,以充当备份(或在必要时作为主要成员接管)。在任何一个发生故障时,虚拟化平台都会根据需要在备用硬件上自动重新启动故障的虚拟机。当 InterSystems IRIS 实例重新启动时,它会自动执行正常的启动恢复,保持结构和逻辑完整性,就像您在物理服务器上重新启动 InterSystems IRIS 一样。使用InterSystems IRIS镜像一个数据库:试一试现在您已经对 InterSystems IRIS 数据弹性及其提供的功能有了一些背景知识,让我们通过镜像来了解其中的一部分。使用 InterSystems IRIS 设置镜像环境很容易。您可以使用自动提供、部署和配置镜像的 InterSystems 云管理器(InterSystems Cloud Manager,ICM),也可以使用管理门户(Management Portal)进行手动配置。本文档介绍如何使用 ICM 部署镜像。(关于使用管理门户[Management Portal]使用两个已安装的 InterSystems IRIS 实例创建镜像的步骤,请参见 High Availability Guide[《高可用性指南》]的 "Mirroring[镜像]"一章中的 Creating a Mirror[创建镜像])。在这种情况下,您将在亚马逊网络服务(Amazon Web Services)公共云中部署一对镜像的 InterSystems IRIS 实例。要做到这一点,请按照《技术概要:InterSystems 云管理器》中 Try It! Deploy InterSystems IRIS in the Cloud with ICM(试一试!使用 ICM 在云中部署 InterSystems IRIS)的 Customize the Sample Configuration Files(自定义示例配置文件)一节中的步骤,进行以下修改:在 defaults.json 文件中,添加"Mirror": "True"。自定义 definitions.json 文件,添加一个 AR 节点定义,指定 arbiter 映像。[ { "Role": "DATA", "Count": "2", "LicenseKey": "ubuntu-sharding-iris.key" }, { "Role": "AR", "Count": "1", "StartCount": "3", "DockerImage": "intersystems/arbiter:stable" }]DockerImage 属性必须是 AR 节点定义的一部分,因为 AR 节点使用不同于 InterSystems IRIS 节点(如 DATA)的 InterSystems 映像(image)。您必须确保 arbiter 映像(image)在本地可用;有关此操作的信息,请参见《技术概要:InterSystems 云管理器》中的 Identify Docker Repository and Credentials(识别 Docker 存储库和凭证)。一旦您定制了配置文件,包括这些变化,就继续执行程序。当您完成了"部署 InterSystems IRIS"步骤(icm run 命令),并且镜像已经部署在云中,继续使用 ICM 命令行来尝试镜像:在主故障转移成员上设置 global,并验证它在备份故障转移成员上也被设置了。触发计划的从主服务器到备份服务器的故障转移。要做到这一点,请使用以下程序:在 ICM 命令行上,通过输入 icm inventory 命令,查看您的镜像成员的名称和镜像角色,其中列出了您已经配置的云主机节点。ICM 提供的节点被命名为 Label-Role-Tag-NNNN;其中 Role 是 ICM 节点类型,在本例中是 DATA,其他部分由您赋值。镜像成员用 +(加号)表示初始主节点,用 -(减号)表示初始备份。本程序其余部分的示例假设您把 label 字段设置为 Acme,把 tag 字段设置为 TEST,从而产生如下所示的 icm inventory 输出:$ icm inventoryMachine IP Address DNS Name Region ZoneAcme-DATA-TEST-0001+ 00.53.183.209 ec2-00-53-183-209.us-west-1.compute.amazonaws.com us-west-1 cAcme-DATA-TEST-0002- 00.53.183.185 ec2-00-53-183-185.us-west-1.compute.amazonaws.com us-west-1 c使用InterSystems IRIS镜像一个数据库:试一试注意: 节点编号和镜像角色之间没有关系。 + 和 - 符号仅表示初始镜像赋值;对于实时镜像状态,请使用 icm ps 命令。通过输入命令在主镜像成员上打开 InterSystems 终端(Terminal):$ icm session -interactive -machine Acme-DATA-TEST-0001当终端(Terminal)窗口打开时,您就处于 DB 命名空间,它被映射到镜像数据库 DB;ICM 默认创建了这两个数据库。输入以下命令在 DB 数据库中创建 global(globals 在 InterSystems IRIS 数据库中存储数据):DB> Set \^myfirstglobal="congratulations"输入以下命令来显示 global 的值:DB> Write \^myfirstglobal congratulations使用以下命令为备份故障转移成员打开终端(Terminal)窗口:$ icm session -interactive -machine Acme-DATA-TEST-0002输入相同的 Write 命令;global 已经存在,并且其值是您在主服务器上设置的。数据被自动同步地镜像到备份中的 DB 数据库。DB> Write \^myfirstglobal congratulations备份中的镜像数据库是只读的;如果您试图改变 global 的值,您会得到一个错误。DB> Set \^myfirstglobal="what next?"<PROTECT>返回到 ICM 命令行,使用以下命令关闭并重新启动其容器内的主要 InterSystems IRIS 实例(ICM 默认将其命名为 IRIS):$ icm exec -command "iris stop IRIS quietly restart" -machine Acme-DATA-TEST-0001注意: -quietly 参数防止 iris stop 命令提示发行者,这将导致 ICM 等待直到超时。另外,您可以交互式地执行命令,如下所示,从而允许您响应提示:$ icm exec -command "iris stop IRIS restart" -interactive -machine Acme-DATA-TEST-0001等待几秒钟,然后返回 Acme-DATA-TEST-0002 上的终端(Terminal)窗口。当主服务器由于计划或计划外的故障而不可用时,镜像将自动故障转移到备份服务器,备份服务器将成为新的主服务器。因此,Acme-DATA-TEST-0002 已经成为主服务器,您现在可以更改 global 的值了。DB> Set \^myfirstglobal="what next?"DB> Write \^myfirstglobal what next?使用 icm ps 命令显示新的镜像角色:$ icm ps了解有关 InterSystems 数据弹性的更多信息为以前的主服务器 Acme-DATA-TEST-0001 打开一个新的终端(Terminal)窗口,重新启动时发现 Acme-DATA-TEST-0002 现在是主服务器,因此成为新的备份。因此,global 的值已经被更新为您在新的主节点上设置的值,您无法更改它。$ icm session -interactive -machine Acme-DATA-TEST-0001 DB> Write \^myfirstglobalwhat next?DB> Set \^myfirstglobal="another First Look!"<PROTECT>备份镜像成员随时准备接管主成员,以保持数据库可用,并保护您的数据不被损坏和丢失。当您完成镜像体验后,请务必返回《技术概要:InterSystems 云管理器》中的 Unprovision the Infrastructure(取消配置基础设施),并根据取消配置您的云节点的程序进行操作。因为 AWS 和其他公共云[]{#4_Learn_More_About_InterSystems_Data_Res .anchor}平台实例会不断产生费用,所以在使用完基础设施后立即取消配置是很重要的。了解有关 InterSystems 数据弹性的更多信息要了解有关 InterSystems IRIS 数据弹性和 ICM 的更多信息,请参见进一步阅读:High Availability Guide(《高可用性指南》)Data Integrity Guide(《数据完整性指南》)InterSystems Cloud Manager Guide(《InterSystems 云管理器指南》)What is InterSystems Cloud Manager?(《什么是 InterSystems 云管理器?》)(视频)The ICM Experience:Pat and Tracy (《ICM 体验:Pat 和 Tracy》) (视频)InterSystems in the Cloud Experience(《云体验中的 InterSystems》) (在线体验)
公告
Claire Zheng · 五月 9, 2021

欢迎中文社区新版主@刘文艺

亲爱的社区开发者们, 我很高兴地向大家介绍一位我们的新版主@刘文艺。 @刘文艺在嘉和美康(北京)科技股份有限公司任职集成平台研发部产品经理。 以下是@刘文艺的自我介绍: 大家好,我带领团队主导了多家大型医院的信息平台开发、系统集成和互联互通项目,有丰富的基于InterSystems产品的开发、部署和项目经验,对医疗信息行业有很深的认识和独特的想法,熟悉医疗行业相关标准,并获得HL7认证证书,和InterSystems技术认证证书。 本人乐于参与组织各种活动,分享经验,协作能力强,善于与人交流,很荣幸在InterSystems开发者社区(中文版)与大家相识,今后希望通过与大家共同努力,不断完善开发者社区的内容建设,提高社区人气的活跃度和忠诚度。让社区更好地为开发者提供知识传播、在线学习等服务。 感谢@刘文艺,恭喜你成为新版主! 热烈欢迎! 欢迎欢迎! 欢迎刘文艺! 作为国内首位开发者大赛的获奖者,请多多和大家分享你的经验哈
公告
Claire Zheng · 十一月 14, 2021

大突破:全球开发者社区已有1万名成员! 中国开发者社区不到一年时间突破270人!增速全球第一!

亲爱的开发者们,我们很高兴地跟大家分享一个好消息! 我们的社区全球注册会员突破10000名!中国开发者社区不到一年时间突破270人!增速全球第一!这是一个了不起的成就!感谢大家的支持🎊 在InterSystems,我们相信社区的力量。所以我们非常感谢你们在过去六年里所做的贡献,并期待未来的道路! 我们希望与大家分享一些有趣的数据,全球社区: 2015年12月上线 总计发布 - 8,600篇 共计提问 - 5,500次 总计浏览 - 430万 中文社区 2021年1月上线 总计发布 - 748篇 共计提问 - 100+次 总计浏览 - 21000+ 不到一年的时间,能够有如此大的成绩,非常感谢所有人的参与和贡献,感谢你们的热情和分享!我们非常感谢大家的帮助,使我们的社区成为InterSystems乃至整个医疗信息化开发人员更好的地方。大家真的很棒! 请随时分享您成为InterSystems开发人员全球和中国大家庭一员的感受! 再次感谢大家,共同成就了这个可爱的大社区! 敬上,开发者社区团队 ❤️
公告
Claire Zheng · 七月 11, 2022

欢迎中文社区新版主@黄念刚

亲爱的社区开发者们, 我很高兴地向大家介绍一位我们的新版主@黄念刚。 让我们以热烈的掌声欢迎 @黄念刚! @黄念刚目前任职于东华医为(Mediway),担任技术支持中心开发工程师一职。 以下是@黄念刚的自我简介: 我从2012年入职东华后开始接触InterSystems 的集成平台。使用过 InterSystems早期的Caché版本, Ensemble,目前使用的最高版本是Ensemble2016。 本人有接近10年的医疗信息化经验,熟悉 HL7 V2/V3,有着丰富的领域知识。 InterSystems 平台是一个非常优秀的集成平台,借助该技术,给我们业务带来了非常大的便利。我希望这么优秀的技术,能给更多的兄弟单位和合作伙伴创造价值。我希望能够在社区与大家一起交流,分享自己的一些实践经验,此外希望借助社区这个平台,向大家学习一些优秀的实践。我们一起成长,共同进步! 再次欢迎我们的新版主@黄念刚👏🏼👏🏼👏🏼👏🏼👏🏼 期待你在DC成长为一名优秀版主! 热烈欢迎!!!
公告
Claire Zheng · 六月 13, 2022

2022 SUTA培训报名启动啦!

SUTA培训是InterSystems专为SUTA有效期客户提供的原厂产品技术服务,具体包括产品的基础管理、编程管理、高级管理和开发培训等。即日起2022 SUTA培训报名启动,本年度为针对InterSystems数据平台产品的线上培训,一共6期12个课程,其中每期两个课程,时间安排在周五下午半天(6月24日—8月5号),6期培训总时长共计三天。点击此处报名,或者扫描下图中的二维码报名,在您的报名信息经过审核后,我们会与您进一步沟通线上培训细节。快来报名吧! 点击下载,了解2022 SUTA培训课程安排详情。
文章
姚 鑫 · 六月 10, 2021

第三章 指定输出的字符集

# 第三章 指定输出的字符集 # 指定输出的字符集 若要指定要在输出文档中使用的字符集,可以设置Writer实例的Charset属性。选项包括`“UTF-8”`、`“UTF-16”`以及InterSystems IRIS支持的其他字符集。 # Writing the Prolog XML文件的序言(根元素之前的部分)可以包含文档类型声明、处理指令和注释。 ## 影响Prolog的属性 在`writer`实例中,以下属性会影响`prolog`: ### Charset 控制两件事`:XML`声明中的字符集声明和(相应的)输出中使用的字符集编码。 ### NoXmlDeclaration 控制输出是否包含XML声明。在大多数情况下,默认值是0,这意味着已经编写了声明。如果没有指定字符集,并且输出定向到字符串或字符流,则默认为1,并且不写入任何声明。 ## 生成文档类型声明 在根元素之前,可以包含文档类型声明,该声明声明了文档中使用的模式。 要生成文档类型声明,需要使用`WriteDocType()`方法,该方法有一个必选参数和三个可选参数。 就本文档而言,文档类型声明包括以下可能的部分: ```java ``` 如这里所示,文档类型有一个名称,根据XML规则,该名称必须是根元素的名称。 声明可以包含外部子集、内部子集或两者。 external_subset 部分指向其他地方的DTD文件。 本节的结构是以下任何一种: ```java PUBLIC public_literal_identifier PUBLIC public_literal_identifier system_literal_identifier SYSTEM system_literal_identifier ``` 这里`public_literal_identifier`和`system_literal_identifier`是包含DTD uri的字符串。 注意,DTD可以同时具有公共标识符和系统标识符。 下面是一个文档类型声明示例,它包含一个同时使用公共标识符和系统标识符的外部子集: ```java ``` internal_subset部分是一组实体声明。 下面是一个文档类型声明的示例,它只包含一组内部声明: ```java !ENTITY city (#PCDATA)> !ENTITY player (#PCDATA)> ] > ``` `WriteDocType()`方法有四个参数: - 第一个参数指定文档类型的名称,用于在这个XML文档中使用。 这是必需的,而且必须是有效的XML标识符。 还必须将此名称用作本文档中根级别元素的名称。 - 可选的第二个和第三个参数指定声明的外部部分,如下所示: WriteDocType参数 第二个参数 | 第三个参数| 其他部分 ---|---|--- “publicURI” |null| PUBLIC “publicURI” “publicURI” |“systemURI”| PUBLIC “publicURI” “systemURI” null |“systemURI”| SYSTEM “systemURI” - 可选的第四个参数指定声明的内部部分。如果此参数非空,则将其括在方括号`[]`中,并适当地放在声明的末尾。没有添加其他字符。 ## 编写处理指令 要将处理指令写入`XML`,请使用`WriteProcessingInstruction()`方法,该方法有两个参数: 1. 处理指令(也称为目标)的名称。 2. 指令本身是一个字符串。 该方法将以下内容写入XML: ```java ``` 例如,要编写以下处理指令: ```java ``` 为此,可以按如下方式调用`WriteProcessingInstruction()`方法: ```java set instructions="type=""text/css"" href=""mystyles.css""" set status=writer.WriteProcessingInstruction("xml-stylesheet", instructions) ``` ## 指定默认命名空间 在编写器实例中,可以指定默认命名空间,该命名空间仅应用于没有`Namespace`参数设置的类。有几个选项: - 可以在输出方法中指定默认命名空间。四个主要的输出方法(`RootObject()`、`RootElement()`、`Object()`或`Element()`)都接受名称空间作为参数。只有在类定义中未设置`Namespace`参数时,才会将相关元素分配给`Namespace`。 - 可以为编写器实例指定总体默认命名空间。为此,请为编写器实例的`DefaultNamespace`属性指定值。 ```java Class Writers.BasicDemoPerson Extends (%RegisteredObject, %XML.Adaptor) { Parameter XMLNAME = "Person"; Property Name As %Name; Property DOB As %Date; } ``` 默认情况下,如果我们只是导出此类的对象,我们会看到如下所示的输出: ```java Persephone MacMillan 1976-02-20 ``` 相反,如果我们在编写器实例中`将DefaultNamespace`设置为`"http://www.person.org",`然后导出一个对象,则会收到如下所示的输出: ```java Persephone MacMillan 1976-02-20 ``` 在本例中, `` 元素使用默认名称空间,否则不会分配给名称空间。
文章
姚 鑫 · 二月 2, 2022

第四十二章 SQL函数 DATEADD

# 第四十二章 SQL函数 DATEADD 一个日期/时间函数,它返回一个时间戳,计算方法是在一个日期或时间戳中添加或减去若干日期部件单位(如小时或天)。 # 大纲 ```java DATEADD(datepart,integer-exp,date-exp) ``` # 参数 - `datepart` - 日期或时间部分的名称(或缩写)。 可以用大写或小写指定该名称,也可以不加引号。 可以将`datepart`指定为文字或主机变量。 - `integer-exp` - 任意数字类型的数字表达式。 该值被截断为整数(正或负)。 该值指示将添加到(或从)`date-exp`中减去的`datepart`单元的数量。 - `date-exp` - 要修改的日期/时间表达式。它可以是日期字符串,也可以是时间戳字符串(`%PosiTime`或`%Timestamp`数据类型),也可以是`CURRENT_DATE`之类的函数。返回的值始终是时间戳,数据类型格式为`%PosiTime`或`%Timestamp`。 # 描述 `DATEADD`函数通过将指定的日期部分递增指定的单元数来修改日期/时间表达式。 例如,如果`datepart`为`“month”`且整数`-exp`为`5`,则`DATEADD`将`date-exp`递增`5`个月。 还可以通过为`integer-exp`指定一个负整数来减少日期部分。 计算出的日期将作为完整的日期/时间表达式(时间戳)返回。返回的数据类型取决于`Date-EXP`的数据类型。如果`Date-EXP`为`%Library.PosiTime`(编码的`64`位有符号整数),则`DATEADD`返回数据类型`%Library.PosiTime`。否则,`DATEADD`返回数据类型`%Library.TimeStamp(yyyy-mm-dd hh:mm:ss.fff)`。 `DATEADD`始终返回有效日期,并考虑一个月的天数,并计算闰年。例如,将1月31日递增一个月将返回2月28日(该月中的最高有效日期),除非指定的年份是闰年,在这种情况下将返回2月29日。将闰年日期2月29日递增一年将返回2月28日。将闰年日期2月29日递增四年返回2月29日。 如果指定包含小数秒的`date-exp`,则返回值也包括小数秒。如果省略`date-exp`的时间部分,`DATEADD`将返回默认时间`00:00:00`。如果省略`date-exp`的日期部分,`DATEADD`将返回默认日期`1900-01-01`。 `DATEADD`和`TIMESTAMPADD`处理季度(`3`个月间隔);`DATEDIFF`和`TIMESTAMPDIFF`不处理季度。 可以使用`TIMESTAMPADD ODBC`标量函数执行类似的时间/日期修改操作。 也可以使用`DATEADD()`方法调用从ObjectScript调用此函数: ```java $SYSTEM.SQL.Functions.DATEADD(datepart,integer-exp,date-exp) ``` # Datepart Argument 日期部分参数可以是以下日期/时间组件之一:全名(日期部分列)或其缩写(缩写列)。这些日期部分组件名称和缩写不区分大小写。 Date Part| Abbreviations |integer-exp = 1 ---|---|--- year| yyyy, yy| Increments year by 1. quarter |qq, q| Increments month by 3. month |mm, m| Increments month by 1. week| wk, ww| Increments day by 7. weekday |dw| Increments day by 1. day |dd, d| Increments day by 1. dayofyear |dy, y| Increments day by 1. hour |hh| Increments hour by 1. minute |mi, n| Increments minute by 1. second |ss, s| Increments second by 1. millisecond |ms| Increments by .001 of a second. microsecond |mcs| 0–999999 (with precision of 6) nanosecond| ns| 0–999999999 (with precision of 9) 递增或递减日期部分会导致适当修改其他日期部分。例如,午夜过后的小时递增会自动递增日期,这又可能会递增月份,依此类推。 日期部分可以指定为带引号的字符串或不带引号。这些语法变体执行的操作略有不同: - `QUOTES`:`DATEADD('month',12,$HOROLOG)`:在创建缓存查询时,日期部分被视为文字。 SQL执行文字替换。这会产生更普遍可重用的缓存查询。 - 无引号:`DATEADD(MONTH,12,$HOROLOG)`:在创建缓存查询时,日期部分被视为关键字。没有文字替换。这会产生更具体的缓存查询。 如果将无效的日期部分值指定为文字,则会发出`SQLCODE-8`错误代码。但是,如果提供无效的日期部件值作为主机变量,则不会发出`SQLCODE`错误,并且`DATEPART`函数返回值为`NULL`。 # 日期表达式格式 `Date-exp`参数可以采用以下任何格式,并且可以包括或省略小数秒: - %Date logical value (+$H) - %PosiTime(%Library.PosiTime)逻辑值(编码的64位有符号整数) - (%Library.TimeStamp)逻辑值(YYYY-MM-DD HH:MM:SS) - %String(或兼容)值 %STRING(或COMPATIBLE)值可以采用以下任何格式: - 99999,99999 ($H format) - /SQL-Server-date Sybase/SQL-Server-time - Sybase/SQL-Server-time Sybase/SQL-Server-date - Sybase/SQL-Server-date (default time is 00:00:00) - Sybase/SQL-Server-time (default date is 01/01/1900) Sybase/SQL-Server-Date是以下五种格式之一: ``` mmdelimiterdddelimiter[yy]yy dd Mmm[mm][,][yy]yy dd [yy]yy Mmm[mm] yyyy Mmm[mm] dd yyyy [dd] Mmm[mm] ``` 其中,分隔符是斜杠(`/`)、连字符(`-`)或句点(`.`)。 `Sybase/SQL-Server-Time`表示以下三种格式之一: ``` HH:MM[:SS:SSS][{AM|PM}] HH:MM[:SS.S] HH['']{AM|PM} ``` 请注意,提供`DATEADD`是为了与`Sybase`和`Microsoft SQL Server`兼容。 # 范围和值检查 `DATEADD`对输入值执行以下检查。如果值未通过检查,则返回空字符串。 - 日期字符串必须完整且格式正确,包含适当数量的元素和每个元素的数字,以及适当的分隔符。年份必须指定为四位数。 - 日期值必须在有效范围内。年份:`0001`到`9999`。月份:`1到12天`:`1到31`。时间:`0点到23点`。分钟:`0到59分钟`。秒:`0到59`。 - 返回的递增的`year`值必须在`0001`到`9999`之间。 超出此范围将返回``。 - 一个月中的天数必须与月和年相匹配。 例如,日期`“02-29”`仅在指定的年份为闰年时有效。 - 小于`10`的日期值可以包括或省略前导零。 不允许使用其他非规范整数值。 因此,`Day`值为`“07”`或`“7”`是有效的,但`“007”`、`“7.0”`或`“7a”`无效。 下面的例子为指定的日期添加了1周: ```sql SELECT DATEADD('week',1,'2018-02-26') AS NewDate 2018/3/5 0:00:00 ``` 它返回`2018-03-05 00:00:00`,因为增加1周会增加7天。 注意,`DATEADD`提供了省略的时间部分。 下面的例子为时间戳添加了`5`个月: ```sql SELECT DATEADD(MM,5,'2017-11-26 12:00:00') AS NewDate 2018/4/26 12:00:00 ``` 它返回`2018-04-26 12:00:00`,因为增加`5`个月也会增加一年。 下面的例子也在时间戳上增加了`5`个月: ```sql SELECT DATEADD('mm',5,'2018-01-31 12:00:00') AS NewDate 2018/6/30 12:00:00 ``` 它返回`2018-06-30 12:00:00`。 这里`DATEADD`修改了日值和月值,因为简单地增加月值将导致6月31日,这是一个无效的日期。 下面的例子为时间戳添加了`45`分钟: ```sql SELECT DATEADD(MI,45,'2018-02-26 12:00:00') AS NewTime 2018/2/26 12:45:00 ``` 下面的示例还为时间戳添加了`45`分钟,但在本例中,添加的内容增加了日,从而增加了月: ```sql SELECT DATEADD('mi',45,'2018-02-28 23:30:00') AS NewTime 2018/3/1 0:15:00 ``` 下面的例子将原始时间戳减去`45`分钟: ```sql SELECT DATEADD(N,-45,'2018-01-01 00:10:00') AS NewTime 2017/12/31 23:25:00 ``` 下面的例子为当前日期添加了`60`天,并根据月份的不同长度进行调整: ```sql SELECT DATEADD(D,60,CURRENT_DATE) AS NewDate 2022/4/4 0:00:00 ``` 在下面的例子中,第一个`DATEADD`为指定的日期添加了`92`天,第二个`DATEADD`为指定的日期添加了`1 / 4`天: ```sql SELECT DATEADD('dd',92,'2018-12-20') AS NewDateD, DATEADD('qq',1,'2018-12-20') AS NewDateQ ``` ![image](037D6F5B02E0464AA1D43B8F18DCA3BD) 第一季将于`2019-03-22 00:00:00`回归; 第二季将于`2019-03-20 00:00:00`回归。 每增加`1 / 4,month`字段就会增加`3`,如果需要,还会增加`year`字段。 它还校正给定月份的最大天数。 上面的例子都使用日期部分的缩写。 但是,也可以用它的全名来指定日期部分,就像下面的例子一样: ```sql SELECT DATEADD('day',92,'2018-12-20') AS NewDate 2019/3/22 0:00:00 ``` 下面的嵌入式SQL示例使用主机变量来执行与前面示例相同的`DATEADD`操作: ```java ClassMethod DateAdd() { s x="day" s datein="2019-12-20" &sql(SELECT DATEADD(:x,92,:datein) INTO :dateout) w "in: ",datein,!,"out: ",dateout } ``` ```java DHC-APP>d ##class(PHA.TEST.SQLCommand).DateAdd() in: 2019-12-20 out: 2020-03-21 00:00:00 DHC-APP> ```
文章
Lilian Huang · 八月 1, 2023

FHIR 应用系列--虚拟实验室: 基于VR和AI的重症监护室模拟培训

VR ICU® 是 InterSystems FHIR 创新孵化器 Caelestinus 的参与者。这篇文章将向您介绍我们利用 InterSystems FHIR Server 为医疗保健提供的 VR 解决方案。 我们是一家技术初创企业虚拟实验室,利用先进的 VR/AR 技术开发解决方案。VR ICU® 是一个针对重症监护室医务人员的培训平台,是在 Covid 时代为满足医院需求而创建的。 与InterSystems合作的优势 我们的 VR ICU® 解决方案符合实践需求,是与医院合作开发的。 除了技术解决方案和技能学习本身,记录培训课程、培训进度和成功率对于医院或麻醉学和重症监护部门的有效管理也至关重要。医务长可以通过了解谁在何时接受了培训,清楚地掌握能够在重症监护室使用设备的人员数量,从而有效地对他们进行培训,以保持技能、有控制地规划人员技能储备并提高他们的能力。 在这方面,与 InterSystems 的合作对我们来说至关重要,它使我们能够在应用程序中存储每次培训期间的数据。目前,我们会记录参与者的姓名、培训日期和时长、培训类型、设备类型、错误数量和类型,必要时还会记录培训成功完成的信息。 如何使用?用户登录应用程序并选择一个账户。 根据 HL7 标准,该账户作为从业人员存在于数据库的资源下。培训课程开始时,会在应用程序中创建一个新的 "任务"--在这里输入培训课程的开始时间和培训课程的类型,课程结束时,再次输入培训课程的结束时间。错误会写入输出表。培训完成后,任务中的数据将序列化为 JSON 格式,并使用 FHIR API 发送到云端。为了使 VR 应用程序之外的数据可视化,我们开发了一款平板电脑应用程序。该应用程序与存储在云端的数据相连,并显示特定用户的个人训练课程。 人力资源部门通过培训数据了解受训人员完成培训的总体情况和水平,从而有效地规划他们的进一步培训,并跟踪了解员工的能力及其在重症监护室护理过程中的替换性。您可以点击这里:https://www.youtube.com/watch?v=3oO0uuHy0kg&t=8s 如今,医院、大学和模拟中心都在使用 VR ICU®。 虚拟现实技术将教育和培训提升到了一个新的水平。通过体验学习,可以提高培训效果和记忆力。 在 VR ICU® 中使用 InterSystems 的 FHIR 云服务器作为存储培训进度数据的工具,并使用 FHIR API 进行通信,这也对我们进军国外市场产生了积极影响,尤其是在德国,FHIR 标准是一种广为接受的解决方案,用于与人力资源部门传输信息,并与第三方调度系统进行通信。 麻醉学和重症监护审查参考:https://www.youtube.com/embed/Qve5xEm89cU?feature=oembed 它是如何开始的? 2020 年,一场大流行病袭击了我国。医院人满为患,人手短缺,尤其是重症监护室。麻醉、复苏和重症医学科主任在晚间新闻中解释说,如果更多的医生被隔离或生病,他就没有足够的合格人员来操作肺部呼吸机。其他医院也证实了同样的情况。我们萌生了制作一个专门用于培训的肺部呼吸机数字拷贝,帮助医院培训其他科室医生的想法。 我们找到了麻醉复苏部(ARO)的负责人、模拟中心的专家。医生们支持我们的想法,有些人还参与了开发工作。我们还得到了医疗设备制造商的支持,他们看到了虚拟现实培训的附加值。 我们是如何开展项目的,解决方案的重要性何在? 1. 我们评估了重症监护室的现状: - 在没有真实病人和/或医疗设备的情况下,50% 以上的重症监护室程序无法进行培训。 - 医疗设备制造商难以将医务人员集中到一处进行培训(只有 30% 的受训人员能坚持到培训结束) - 过去两年中,麻醉学和重症监护部门的人员流动率约为 20%。 2. 问题的解决方案: - 虚拟现实自动培训平台 - 模拟重症监护室的手术过程,无需真实病人,也无需使用真实医疗设备 - 节省技术和医疗用品 - 也可用于远程培训,从不同地点/工作场所进入同一个虚拟空间 - 在安全的环境中进行风险情况演练 - 将人为错误的风险降至最低 3. 潜力: - 利用人工智能(AI)模拟和练习危急情况,确定正确的程序 - 人工智能可模拟病人-设备-病人之间的互动 - 制造商的设备集中在一个虚拟空间,使医院的培训更加容易 愿景 VR ICU® 的目标是作为一个平台,让医院从实际使用的设备目录中选择 3D 设备,并从中创建培训环境。 我们向医疗设备制造商提出的愿景最初得到了 BBraun、费森尤斯和 Linet 的支持。随后,其他公司也纷纷效仿这些大胆的先行者。我们还根据所进入的市场扩大我们的设备组合。目前,我们在美国、亚洲和南美都有合作伙伴,他们正在补充信息并与制造商进行谈判。 我们正在全球会议上展示 VR ICU®,我们很高兴能成为 Caelestinus 孵化器的一部分。由于我们与 InterSystems 的合作,我们有机会参加在西雅图举行的 InterSystems 2022 年全球峰会,现在我们正在拉斯维加斯参加 HLTH 2022。 VR ICU® 已经赢得了许多奖项,最近在奥地利林茨,我们凭借该解决方案赢得了最佳初创企业奖。 这些成功的展示吸引了投资者的关注。我们欢迎那些希望进一步开发我们产品的人向我们推荐他们。我们计划在 2023 年向捷克、斯洛伐克和德国的医院出售许可证。我们欢迎商业合作伙伴以及能够加快 VR ICU® 实际应用--市场进入进程或希望为人工智能/VR 版本的开发做出贡献的合作伙伴。 原文来自这里:https://community.intersystems.com/node/529381
文章
TZ Zhuang · 六月 22, 2021

FAQ 常见问题系列--系统管理篇 每个InterSystems IRIS实例可以创建多少个数据库和命名空间

一个实例中可创建的最大命名空间数量为2048个。这个上限不可修改。 一个实例中可创建的最大数据库数量(包括远程数据库)为15998个。这个上限也不可修改。 一个实例中可创建数据库的总数量还有其他因素制约: 1. 数据库路径信息总量最大为256KB,也就是所有数据库的路径字符加起来不能多于256KB。设置的路径越长,可创建的数据库数量越少。计算公式:最大数据库数量=258048/(平均数据库路径长度+3) 2. 镜像的数据库一个按两个算。也就是创建一个镜像的数据库,相当于创建了2个非镜像数据库。 更多细节请参考在线文档:https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=GSA_config
文章
Michael Lei · 八月 9, 2022

如何以编程/自动化方式为InterSystems IRIS创建新的数据库、命名空间和Web应用程序

下面是一个ObjectScript片段,它允许为InterSystems IRIS创建数据库、命名空间和Web应用程序: ``` set currentNS = $namespace zn "%SYS" write "Create DB ...",! set dbName="testDB" set dbProperties("Directory") = "/InterSystems/IRIS/mgr/testDB" set status=##Class(Config.Databases).Create(dbName,.dbProperties) write:'status $system.Status.DisplayError(status) write "DB """_dbName_""" was created!",!! write "Create namespace ...",! set nsName="testNS" //DB for globals set nsProperties("Globals") = dbName //DB for routines set nsProperties("Routines") = dbName set status=##Class(Config.Namespaces).Create(nsName,.nsProperties) write:'status $system.Status.DisplayError(status) write "Namespace """_nsName_""" was created!",!! write "Create web application ...",! set webName = "/csp/testApplication" set webProperties("NameSpace") = nsName set webProperties("Enabled") = $$$YES set webProperties("IsNameSpaceDefault") = $$$YES set webProperties("CSPZENEnabled") = $$$YES set webProperties("DeepSeeEnabled") = $$$YES set webProperties("AutheEnabled") = $$$AutheCache set status = ##class(Security.Applications).Create(webName, .webProperties) write:'status $system.Status.DisplayError(status) write "Web application """webName""" was created!",! zn currentNS ``` 还有以下其他文档手册: - [创建数据库](https://irisdocs.intersystems.com/iris20181/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=Config.Databases) - [命名空间](https://irisdocs.intersystems.com/iris20181/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=Config.Namespaces) - [CSP 应用](https://irisdocs.intersystems.com/iris20181/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=Security.Applications)
文章
Nicky Zhu · 九月 22, 2021

IRIS 2021 技术文档 First Look 7 -- 技术概要: 数据转换

本文档将帮助您使用 InterSystems IRIS®数据平台集成产品转换数据。 要浏览所有的技术概要(First Look),包括可以在 InterSystems IRIS 免费的评估实例上执行的那些, 请参见 InterSystems First Looks(《InterSystems 技术概要》)。 数据转换和互操作性 数据转换是 InterSystems IRIS 互操作性的核心。您可以改变从一个系统传入的数据的格式和内容,以满足下游系统的要求,从而允许系统之间进行通信。简单地说,从一个系统发送的信息可以转换为另一个应用程序可以理解的信息。使用 InterSystems IRIS,可以很容易地进行数据转换的创建、测试和维护。 假设您有两个包含产品价格的零售系统。当系统 A 向其他系统发送数据时,包含了不加税的产品基准价格。但是,系统 B 需要在价格中包含地区税。InterSystems IRIS 互操作性产品中的数据转换可以在将数据发送到系统 B 之前将从系统 A 收到的价格转换为加税价格。一旦定义,数据转换将自动处理修改。 常见的转换包括: 将值(value)从源信息复制到目标信息。 根据源信息的(value)执行计算,并将结果复制到目标信息。 为目标信息分配新的值(literal value)。 重新排列数据的顺序。 探索 DTL 编辑器 您可以编写 DTL(数据转换语言)代码来创建数据转换,也可以使用 DTL 编辑器(DTL Editor)来创建。DTL 编辑器(DTL Editor)允许非技术用户无需编写代码就可以创建数据转换。例如,它的图形用户界面允许您通过拖放操作快速地将值从源信息映射到目标信息。下面的 DTL 编辑器(DTL Editor)之旅将通过在产品中创建数据转换来指导您了解其主要功能。有关 InterSystems IRIS 产品的介绍,请参见 First Look:Connecting Systems Using Interoperability Productions(《技术概要:使用互操作性产品连接系统》)。 在这个演示中,必须转换班级里学生的期末成绩数据,以便不同的应用程序可以使用这些数据。 想试试 InterSystems IRIS 互操作性功能的在线视频演示吗?请查看 Interoperability QuickStart(互操作性快速入门)! 用前须知 在开始使用 DTL 编辑器(DTL Editor)之前,您需要完成以下工作: 选择一个 InterSystems IRIS 实例。 从 GitHub 下载 InterSystems IRIS 产品和示例文件。 创建一个支持互操作性的命名空间。 将下载的产品导入命名空间. 选择 InterSystems IRIS 实例 要使用该程序,您需要一个正在运行的 InterSystems IRIS 实例。您的选择包括多种类型的已授权的和免费的评估实例;该实例不需要由您正在工作的系统托管(尽管它们必须相互具有网络访问权限)。有关如何部署每种类型的实例的信息(如果您还没有可使用的实例) 请参见 InterSystems IRIS Basics: Connecting an IDE(InterSystems IRIS 基础:连接一个 IDE)中的 Deploying InterSystems IRIS(部署 InterSystems IRIS)。 从 GitHub 下载 从 https://github.com/intersystems/FirstLook-Data- Transformations 中下载本演示所使用的产品和数据文件。XML 文件是即将部署在系统上的 InterSystems IRIS 产品的载体,您可以通过XML文件导入或导出Production代码。 实例必须可以访问技术概要-数据转换(FirstLook-DataTransformations) 源。下载文件的程序取决于您所使用的实例类型,如下所示: 如果您使用的是 ICM 部署的实例: 使用带有-machine 和 -interactive 选项的 icm ssh 命令,在托管实例的节点上打开默认 shell,例如: icm ssh -machine MYIRIS-AM-TEST-0004 -interactive 在 Linux 命令行上,使用以下命令之一将 repo 克隆到实例的数据存储卷(data storage volume)。例如,对于部署在 Azure 上的配置,数据卷的默认挂载点(default mount point)是 /dev/sdd,因此您可以使用如下命令: $ git clone https://github.com/intersystems/FirstLook-DataTransformations /dev/sdd/FirstLook-DataTransformations OR $ wget -qO- https://github.com/intersystems/FirstLook-DataTransformations/archive/master.tar.gz | tar xvz -C /dev/sdd 这些文件现在对容器文件系统上 /irissys/data/FirstLook-DataTransformations 中的 InterSystems IRIS 可用。 如果您正在使用通过其他方式部署的容器化实例(授权版或社区版[Community Edition]): 在主机上打开 Linux 命令行。(如果您在云节点上使用社区版[Community Edition]),请使用 SSH 连接该节点,如在 Deploy and Explore InterSystems IRIS[《部署和探索 InterSystems IRIS》] 中所述。) 在 Linux 命令行上,使用 git clone 或 wget 命令,如上所述,将 repo 克隆到容器中挂载为卷的存储位置。 - 对于社区版(Community Edition)实例,您可以克隆到实例的持久化 %SYS 目录 (存储特定于实例的配置数据的目录)。在 Linux 文件系统中,这个目录是 /opt/ISC/dur。这使得文件对容器文件系统上 /ISC/dur/FirstLook-DataTransformations 中的 InterSystems IRIS 可用。 - 对于已授权的容器化实例,选择容器中作为卷挂载的任何存储位置(如果使用它,包括持久化 %SYS 目录)。例如,如果您的 docker run 命令包含选项 -v /home/user1:/external, 并且您将 repo 克隆到 /home/user1,则文件对容器文件系统上 /external/FirstLook-DataTransformations 中的 InterSystems IRIS 可用。 如果您使用的是 InterSystems 学习实验室(Learning Labs)实例: 在集成 IDE 中打开命令行终端。 将目录更改为 /home/project/shared 并使用 git clone 命令克隆 repo: $ git clone https://github.com/intersystems/FirstLook-DataTransformations 该文件夹被添加到左边资源管理器(Explorer)面板的 Shared (共享)下,并且该目录对 /home/project/shared 中的 InterSystems IRIS 可用。 如果您使用的是已安装的实例: 如果实例的主机是安装了 GitHub 桌面(GitHub Desktop)和 GitHub 大文件存储(GitHub Large File Storage)的 Windows 系统: 在主机的 web 浏览器中进入 https://github.com/intersystems/FirstLook-DataTransformations。 选择 Clone or download(克隆或下载) 然后选择 Open in Desktop(在桌面上打开)。 这些文件对您的 GitHub 目录中的 InterSystems IRIS 可用,例如在 C:\Users\User1\Documents\GitHub\FirstLook-DataTransformations 中。 如果主机是 Linux 系统, 只需在 Linux 命令行上使用 git clone 命令或 wget 命令将 repo 克隆到您所选择的位置。 创建一个支持互操作性的命名空间 在导入从 GitHub 下载的产品之前,您必须创建一个支持互操作性的命名空间。如果您已经在实例上创建了一个支持互操作性的命名空间,您可以将它用于此产品。要创建一个新的支持互操作性的命名空间,请使用以下过程。(您首次安装 InterSystems IRIS 时创建的命名空间不支持互操作性)。 使用 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中URL described for your instance(实例适用的URL),在浏览器中打开您的实例的管理门户(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(为命名空间启用互操作性Production) 复选框。 选择靠近页面顶部的 Save(保存) ,然后在生成的日志末尾选择 Close(关闭)。 导入演示产品 要导入包含数据转换的演示Production,请使用此程序: 在管理门户(Management Portal)中,选择 Interoperability(互操作性) > Manage(管理) > Deployment Changes(部署变更) > Deploy(部署),进入 Deploy Production Changes(部署Production变更) 页面。 如果出现提示,请选择在完成此步骤之前创建的命名空间。 点击 Open Deployment(打开部署)。 进入您从 GitHub 下载文件的目录,选择 DTLStudentDemo.xml,然后点击 OK(确定)。 点击 Deploy(部署)。 点击 OK(確定)。 创建数据转换 InterSystems IRIS 提供了一个数据转换向导(Data Transformation Wizard),以加速和简化创建新数据转换的过程。在本演示中,您将创建一个数据转换,该数据转换连接与班级学生成绩相关的两个记录映射。要创建数据转换: 从管理门户(Management Portal)主页,选择 Interoperability(互操作性) > List(列表) > Data Transformations(数据转换)。 点击 New(新建)。数据转换向导(Data Transformation Wizard)打开。 在 Package(包)下拉列表中选择 Demo(演示)。 在 Name(名称) 字段中,输入一个独特的名称,如 DTLDemoTransform。 点击 Source Class(源类) 字段旁边的放大镜。 点击 Message Classes(信息类) > Demo(演示) > Complex Map(复杂映射) > StudentWCD > Record(记录)。 点击 Target Class(目标类) 字段旁边的放大镜。 点击 Message Classes(信息类) > Demo(演示) > Complex Map(复杂映射) > StudentPFFixed > Record(记录)。 点击 OK(确定)。新的数据转换会在 DTL 编辑器(DTL Editor)中打开。 转换数据 现在您已经创建了数据转换,使用 DTL编辑器(DTL Editor): 将数据从源(source)复制到目标(target),根据需要重新排列数据的顺序。 在课程编号的开头添加学院专用代码。 将最终成绩四舍五入为整数。 使用期末成绩来确定学生是通过还是不通过,并在目标文件中指出这个结果。 忽略目标中不需要的源数据。 复制数据 DTL 编辑器(DTL Editor)最强大、最省时的功能之一是能够将值从源(source)拖放到目标(target)的相应属性。您只需点击并按住源属性上的圆圈,并将其拖动到目标信息的属性。 要将值从源(source)复制到目标(target): 点击并按住源(source)的 ClassID 属性的圆圈(在编辑器[Editor]的左侧)。 将光标拖动到目标(target)的 ClassID 属性,直到它被高亮显示,然后释放鼠标按钮。 源(source)的 ClassID 的值将被复制到目标(target)的 ClassID 属性。 按照此程序,将下列源属性连接到相应的目标属性: 学生 ID(StudentID) 成绩(Grade) 姓氏(LastName) 名字(FirstName) 中间名(MiddleName) 编辑器(Editor)现在应该是这样的: 请注意,仅仅通过连接属性对(property pairs),您便已经更改了存储数据的顺序。 修改属性(Property)的值 在某些情况下,您希望在将源属性(source property)复制到相应的目标属性(target property)之前更改其值。在这个演示中,目标系统接受一个 ClassID,这个 ClassID 以两个字符的标识符开头,表示源(Source)的学院。源的信息不包括这个标识符,因此数据转换必须在将 ClassID 的值复制到目标信息之前修改它。 点击,连接源的 ClassID 属性和目标的 ClassID 属性的线上的圆圈。 请注意,编辑器(Editor)右侧的 Action(操作) 标签现在显示了连接两个 ClassID 属性时创建的 Assign 操作的信息。Property(属性) 字段被设置为 target.ClassID,Value(值)字段被设置为 source.ClassID。 将 Action(操作) 标签的 Value(值) 字段变更为: "UC."_source.ClassID。UC 是学院的标识符,它使用下划线添加到 ClassID 的开头,下划线是 InterSystems ObjectScript 编程语言中的连接操作符。这超出了本演示的范围,但它让您了解如何在转换中包含 ObjectScript 代码。 使用函数 在设置属性值时,您可以使用内置函数。在本演示中,使用 Round() 函数将最终成绩四舍五入为整数。 选择源的成绩(Grade)属性和目标的成绩(Grade)属性之间的连接器。 点击 Action(操作) 标签的 Value(值) 字段旁边的放大镜。 从 Function (函数) 下拉列表中选择 Round ( )。 点击 OK(确定定)。 将 Action(操作) 标签的 Value(值) 字段设置为:..Round(source.Grade) 使用操作表 请注意,当您将源属性(source property)映射到目标属性(target property)时,DTL 编辑器(DTL Editor)将 Set(设置)操作添加到图表下方的表格中。 虽然 DTL 编辑器(DTL Editor) 的图形化部分使可视化和快速执行操作变得容易,但有时使用图表下方的表格来进一步定义转换会更好。例如,在本演示中, 在源属性和目标属性之间单击图形连接是选择 Set(设置)操作的最快方法。然而,在更复杂的转换中,可能很难选择连接器。在这种情况下,从图表下方的表格中选择 Set(设置)操作会更容易些。 定义有条件的操作集 在转换数据时,只有在某些条件为真时,才能使用条件语句执行操作。在本演示中,您定义了一个转换,如果期末成绩大于或等于 65 分,则表示学生通过了该课程。要添加 If 语句来完成此操作: 确保最后一项是高亮显示的表格。If 语句位于高亮显示的操作之后。 从 Add Action(添加操作) 下拉列表中选择 If。 请注意,图表下方的表格中添加了一个 If 块。 在表格中选择 If 语句后, 在 Action(操作) 标签上定义 Condition(条件)字段为: target.Grade>=65。只有当目标的成绩(Grade) 属性值大于或等于 65 时,才会执行放在 If 块内的操作。 从 Add Action(添加操作)下拉列表中选择 Set(设置)。 在 Action(操作) 标签上,定义 Property(属性) 字段为:target.Pass。 定义 Value(值) 字段为 1。这是一个布尔值(boolean value),表示该学生通过了这门课程。 选择表格中的 else(其他) 操作。 从 Add Action(添加操作)下拉列表中选择 Set(设置)。 在 Action(操作) 标签上,定义 Property(属性) 字段为:target.Pass。 在 Action(操作) 标签上,定义 Value(值) 字段为 0。这是一个布尔值(boolean value),表示该学生没有通过这门课程。 if 块现在应该是这样的: 忽略来自源信息(Source Message)的数据 在演示中,请注意 Email、Phone 和 Phone1 属性没有连接到目标信息。不需要进一步的操作来防止源信息中的这些数据被复制到目标信息。 编译数据转换 您可以选择随时保存工作,但必须始终记住编译数据转换。在您点击 Compile(编译)之前,产品无法识别更改。 进行初步测试 DTL 编辑器(DTL Editor)使您能够快速测试数据转换,而不必在整个生产过程中运行信息。您只需输入测试信息,DTL 编辑器(DTL Editor)就会显示输出信息的样子。在本演示的这一点上,您将记录映射数据的 XML 表示(XML representation)粘贴到测试转换(Test Transform)工具中。 稍后,您将通过在产品中运行文本文件来测试这个转换。 记住在测试数据转换之前要编译它。 点击编辑器右侧的 Tools(工具) 标签。 点击 Test(测试)。 将以下数据复制并粘贴到 Input Message(输入信息)文本框中: <test> <Record> <ClassID>CS241</ClassID> <StudentID>930698</StudentID> <Grade>77.8</Grade> <LastName>Sutherland</LastName> <FirstName>David</FirstName> <MiddleName>Timothy</MiddleName> <Email>david.sutherland@mail.com</Email> <Phone>978-343-3940</Phone> <Phone1>978-343-0951</Phone1> </Record> </test> 点击 Test(测试)。 Output Message(输出信息)文本框现在应该是这样的: <Record> <StudentID>930698</StudentID> <ClassID>UC.CS241</ClassID> <Grade>78</Grade> <Pass>true</Pass> <FirstName>David</FirstName> <MiddleName>Timothy</MiddleName> <LastName>Sutherland</LastName> </Record> 提示: 在处理 HL7 或其他 EDI 信息时,您可以从示例信息中复制和粘贴原始文本来测试转换。您不需要信息的 XML 表示(XML representation)。 向产品添加转换 现在您已经创建并编译了数据转换,必须将其添加到产品中,以便将流经产品的源信息转换为发送到下游应用程序的信息。在本演示中,您将向与业务流程 DTLDemoRouter 关联的业务规则添加转换。 从管理门户(Management Portal)主页,进入 Interoperability(互操作性) > List(列表) > Productions(产品)。 选择 Demo.ComplexMap.SemesterProduction 并点击 Open(打开)。 选择 Processes(进程)下的 DTLDemoRouter。 在 Settings(设置)标签上,点击 Business Rule Name(业务规则名称)字段旁边的放大镜。 双击位于业务规则 send(发送)操作中的 transform(转换)形状。 在 Data Transform Selector(数据转换选择器) 对话框中,选择您为这个演示创建的数据转换。 点击 OK(確定)。 在业务规则编辑器(Business Rule Editor)中,点击 Save(保存)。 有关业务规则的更多信息,请参见 Developing Business Rules(《开发业务规则》)。 测试数据转换 现在您已经将数据转换添加到产品中,运行产品以查看您的演示如何运行。在这一步骤中: 创建产品接收和发送示例文件的目录。 启动产品。 将示例输入文件复制到正确的目录中。 比较目标文件和源文件的内容。 创建所需的目录 演示产品被定义为在实例的主机 c:\practice\in 中查找包含源数据的文件,并将目标文件编写到 c:\practice\out 中。如果您不能在主机的 c:\ drive 上创建目录,或者它不是 Windows 系统,您必须识别或创建替代目录,然后在继续之前修改产品的业务服务和业务操作。业务服务的 File Path(文件路径)设置定义了产品查找输入文件的位置,而业务操作的 File Path(文件路径)设置定义了发送目标文件的位置。 创建目录的方式这取决于使用的实例类型 ,如下所示: 对于由 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)中浏览到这些。 对于已安装的实例,在本地文件系统上创建目录。 本练习的其余部分假设目录路径为 c:\practice\in 和 c:\practice\out;如果不同,请替换为正确的路径。 启动产品 要启动包含演示数据转换的产品: 从管理门户(Management Portal)主页,进入 Interoperability(互操作性) > List(列表) > Productions(产品)。 选择 Demo.ComplexMap.SemesterProduction 并点击 Open(打开)。 点击 Start(开始)。 复制 .CSV 文件到目录 产品被定义为接受一个 .CSV 文件,其中包含来自 c:\practice\in 的学生信息。将 input.csv 文件从包含 GitHub 文件的目录复制到输入目录,或者 c:\practice\in ,或者您创建并指定的其他目录。 只要产品在运行,该文件就应该在几秒钟内从目录中消失,这表明产品已经开始成功地处理该文件。 验证输出数据 演示产品使用复制到产品的输入目录中的 .Csv 文件,并使用数据转换将数据转换为具有新内容的不同格式。这个传出文件被复制到产品的输出目录中,要么是 c:\practice\out ,要么是您创建并指定的另一个目录,文件名为时间戳。 打开 input.csv 和输出文件并比较两者。 其他重要功能 本演示提供了开发和测试数据转换的基础知识。其他重要的、常用的功能包括: for each 语句遍历一个集合,对集合的每个成员执行相同的操作序列。这个集合可以是一个数组,在 HL7 或其他 EDI 信息的情况下,也可以是一个重复段。更多信息,请参见 Adding a For Each Action(添加 For Each 操作)。 子转换,它允许您模块化数据转换。数据转换可以使用子转换操作在操作流的任何点上运行另一个转换。您可以创建可重用转换的库, 这些库可以从其他转换调用,从而避免重复转换逻辑。例如,您可以针对HL7 V2消息中的段创建段转换,只要这些段出现在 EDI 信息中就可以重复使用。 支持 X12 和 EDIFACT 标准。当使用数据转换向导创建新的转换时,您可以指定信息类型是 X12 还是 EDIFACT。这允许您选择使用正确的模式填充 DTL 编辑器(DTL Editor)的文档类型。这些模式段的可视化表示在 DTL 编辑器(DTL Editor)中展开和折叠。 了解有关数据转换的更多信息 有关数据转换的更多细节,请参见: Developing DTL Transformations(《开发 DTL 转换》) Advanced Data Transformations(高级数据转换) (在线课程) Business Process and Data Transformation Language Reference(《业务流程和数据转换语言参考》)
公告
Michael Lei · 三月 22, 2023

Caelestinus 2023 孵化器活动正式启动!

大家好! 第二次数字健康互操作与FHIR创业孵化器——Caelestinus,今日启动! 今天,21 支选定的队伍将在 Caelestinus 开始为期八个月的旅程。在孵化期间,团队将数字健康互操作性引入到他们的互联医疗服务或医疗设备创新中,并添加对 FHIR、HL7、DICOM、CDA、X12 和其他数字健康标准的支持,并使用InterSystems IRIS for Health和FHIR Server进行转型在经验丰富的 InterSystems 团队的帮助下。 我很高兴邀请大家观看 Caelestinus 2023 启动活动直播,您可以在其中了解哪些团队被选中以及他们的创新想法。 请从欧洲中部时间下午 3 点开始通过www.caelestinus.tech观看流媒体。 很高兴在在线上与您相见。 祝 Caelestini 初创公司好运!
文章
Kelly Huang · 三月 28, 2023

安装本地 FHIR 服务器的最快最简单的方法!

嗨大家好! 最近我需要使用 IRIS For Health 设置本地 FHIR 服务器,我认为我找到了有史以来最简单的方法! 只需在终端中运行以下两行: docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/irishealth-community 和 docker exec -it my-iris iris session iris -U "USER" '##class(%ZPM.PackageManager).Shell("install fhir-server")' 您将在 http://localhost:9092/fhir/r4 本地运行 FHIR 服务器。 就是这么简单! FHIR 服务器将使用最新版本的 InterSystems IRIS for Health Community Edition,并将通过 FHIRSERVER 命名空间中的 IPM 包从该应用程序部署 FHIR 服务器。 这是针对 Mac OS的,所以请在评论中添加它在 Windows 中的工作方式。 这是一篇非常短的文章,因为使用 InterSystems IRIS for Health 和IPM Package Manager 设置本地 FHIR 服务器真的很容易。 原文来自于 @ Evgeny Shvarov
文章
Lilian Huang · 五月 26, 2022

在线用Demo服务器工具的重要性- 引自“Importance of the Online Demo Server facility”

#Open Exchange 您可能已经看到邀请分享您的 Open Exchange 应用程序的演示:Share a Demo of Your Open Exchange Application它背后的服务——InterSystems Online Demo Server (ODS)——这不是什么新事物 作为奖励积分,我在 21 年 3 月的 InterSystems 开发者工具大赛:InterSystems Developer Tools Contest 中第一次看到它。在后来的比赛中成为一个固定的奖励项目。实际是#24。到今天,我们已经看到 OEX 中列出了 80 个可在 ODS 上使用的软件包:80 packages listed in OEX as available on ODS 对我来说,开发人员的优势是显而易见的: 给予您的“客户”直接访问您产品的渠道。 视频也是一个很好的推广工具。 但是您知道使用自己的产品并没有那么令人印象深刻。 您的 Docker 容器是在“规范”安装中构建的。 毫无疑问,Docker 是一个令人印象深刻的工具。 在 Win、MAC 和 Linux 上有各种可能会让人头疼的版本。 我跳过关于特殊功能和设置的个人赘述。 您的“客户”可以节省时间来快速查看您提供的方案。 您可以确定他会看到您计划让他看到的内容。 您对容器的端口和其他“本地”变体没有任何问题 所以听听我的信息: 使用 ODS 配置您的方案以获得更好的可见性和更多奖励积分! 我敢肯定,你是赢家! 原文链接:https://community.intersystems.com/node/518386