1.Caché数据库有没有办法配置然后用sql读取数据库实时变化的数据,类似于mssql那样?我看了可以写类去读取global获取journal的值,但是怎么用sql读呢?
2.不行的话,那用什么方式可以读取到journal日志文件,并输出日志文件的内容?
先谢谢大家了!!!
1.Caché数据库有没有办法配置然后用sql读取数据库实时变化的数据,类似于mssql那样?我看了可以写类去读取global获取journal的值,但是怎么用sql读呢?
2.不行的话,那用什么方式可以读取到journal日志文件,并输出日志文件的内容?
先谢谢大家了!!!
可以通过以下两种方式之一指定 OPEN 模式参数
“VRWN”。每个字母都指定一个参数。字母代码可以按任何顺序指定;因为 IRIS 按照从左到右的顺序执行它们,所以在某些情况下,字母代码之间的交互可能会决定首选顺序。/keyword 参数,未加引号。这些参数用冒号分隔。关键字参数可以按任意顺序指定;因为 IRIS 以从左到右的顺序执行它们,所以在某些情况下,参数之间的交互可能会决定首选顺序。指定字母代码参数和关键字参数的组合时,请先指定字母代码字符串,然后指定关键字参数,用冒号分隔。以下示例指定三个字母代码参数,后跟两个关键字参数,后跟 reclen 和 timeout 参数。
OPEN "mytest":("WNS":/OBUFSIZE=65536:/GZIP=0:32767):10
新建文件。如果指定的文件不存在,则系统创建该文件。如果指定的文件已作为 ReadOnly 文件存在,则系统会删除旧文件并将其替换为同名的新文件(权限允许)。请注意,应使用文件锁定来防止使用此参数的并发进程覆盖同一文件。
如果未指定 “N” 模式(或 “T” 模式),并且在 OPEN 中指定的文件不存在,则 Windows 和 UNIX® 默认为不创建新文件。
为支持医疗信息行业人才发展,InterSystems 为中国市场量身定制了贴近需求、灵活、实操性强的技术认证培训计划,由 InterSystems 资深技术专家亲自授课,帮助用户快速掌握 InterSystems 技术,确保用户从快速发展的 InterSystems 技术中获益,以更好地服务于医院信息化建设。点击此处查看课程详情:InterSystems中国技术培训认证
如果当前设备是顺序文件,则$ZIO包含该文件的完整路径名。
可以使用$ZSEARCH返回指定文件或目录的完整文件规范(路径名和文件名)。文件名可能包含通配符, $ZSEARCH使用通配符返回一系列满足通配符的完全限定路径名。
%Library.File 类包含许多提供文件系统服务的方法。这些包括:
NormalizeDirectory(),返回指定文件或目录的完整路径名。NormalizeFilenameWithSpaces(),根据主机平台的情况处理路径名中的空格。如果路径名包含空格字符,则路径名处理取决于平台。 Windows 和 UNIX® 允许路径名中包含空格字符,但包含空格的整个路径名必须用一组附加的双引号 (") 字符括起来。这与 Windows cmd /c语句一致。有关详细信息,请指定cmd / ?在 Windows 命令提示符下。~) 扩展在 Windows 路径名中,波形符 (~) 表示长名称的 8.3 压缩。例如: c:\PROGRA~1\ 。要转换压缩目录名称,请使用 %Library.File 类的 NormalizeDirectory() 方法。
在 UNIX 路径名中,可以使用波形符 (~) 扩展来指示当前用户的主目录或指定用户的主目录:
~和~/myfile.本页介绍在 IRIS 数据平台中使用顺序文件。
重要:在大多数情况下,可以使用 %Library.File 类提供的 API,而不需要此页面上的详细信息。请参阅使用 %Library.File 。
所有操作系统都将磁盘 I/O 文件视为顺序文件。 Windows 系统将打印机视为顺序文件 I/O 设备(除非打印机通过串行通信端口连接)。 UNIX® 系统将打印机视为终端 I/O` 设备。有关打印机的更多详细信息,请参阅打印机。
本节讨论 IRIS 如何处理顺序文件。它提供了顺序文件 I/O 的介绍以及相关命令的说明。
OPEN命令打开该文件,并提供文件名作为参数。还可以选择指定OPEN模式参数。如果OPEN指定的文件不存在,则模式参数指定是否创建新文件。您可以同时打开多个文件。USE命令使指定文件成为当前设备;因此一次只能使用一个文件。 USE命令还可以指定模式参数。READ或WRITE命令。每个READ或WRITE命令都会向文件传送一条记录或从文件传送一条记录。除非使用“W”模式参数打开该文件,否则无法写入该文件。尝试读取超过文件末尾会导致错误。转义序列的 ANSI 标准使智能终端的编程变得实用。字符串中转义字符及其后面的所有字符不会显示在屏幕上,但会更新$X和$Y 。使用WRITE *语句将转义序列发送到终端,并通过直接设置$X和$Y来保持它们最新。
ANSI 标准建立了转义序列的标准语法。特定转义序列的效果取决于使用的终端类型。
每次READ之后在$ZB中查找传入的转义序列。 IRIS 将 ANSI 标准转义序列和任何其他使用 ANSI 形式的转义序列放入$ZB中。 IRIS 可识别两种形式的转义序列:
An ESC.“O”(字母),十进制值 79。32–47 的字符。48–126 的一个字符。ESC字符,十进制值 27。“[”字符,十进制值 91。48–63 的字符。32–47 的字符。64–126 的一个字符。此外,序列不能超过 16 个字符。违反这些形式或规则的转义序列设置$ZA的位 8,其值为 256。
假设正在对一个终端进行编程,其帮助键发送两个字符序列Escape-? ( ?的十进制值为 63)
%SYS>SET HELP=$C(27,63)
ASK READ !PRINT 和 ZPRINT 命令将当前加载的 IRIS 例程的一行或多行写入当前设备。
ZPRINT与PRINT`具有相同的效果和参数。
PRINT
ZPRINT
PRINT x
ZPRINT x
PRINT x:y
ZPRINT x:y
| 参数 | Definition 定义 |
|---|---|
(none) |
不带参数的PRINT或ZPRINT命令打印整个例程。 |
x,y |
变量x和y指示要打印的行范围。它们可以是 TAG+OFFSET 形式的行引用,也可以是 +7 形式的行号。引用不在例程中的行意味着例程最后一行后面有空行。 x = 要打印的第一行或唯一一行。 y = 要打印的最后一行。 |
此示例打印当前例程的第一行、从 INIT 开始的四行以及从 FINI 到结尾的所有行:
INIT
SET a=1
SET b=2
SET c=3
SET d=4
FINI
SET x=24
SET y=25
SET z=26
PRINT +1,INIT:INIT+3,FINI:+9999
IRIS 对格式化 CRT 屏幕进行编程终端 I/O 的几个功能有助于对格式化屏幕进行编程:
WRITE *轻松发送控制序列。READ接收转义序列响应。DTM PC 控制台的助记符空间IRIS 提供 IRIS 例程 %XDTM 来匹配开发 DTM 应用程序时使用的助记符。该助记词空间可用,但未设置为终端默认助记词空间。如果您将为 DTM 创建的应用程序移植到 IRIS,可以:
^%XDTM 配置为终端( MnemonicTerminal )的默认助记词空间,或者OPEN或USE命令中引用 ^%XDTM 助记符空间。DTM 示例UNIX OPEN "/dev/tty04/"::"^%XDTM"
Windows OPEN "c:\sys\user"::"^%XDTM"
然后 IRIS 可以正确解释WRITE /mnemonic命令中的 DTM 控制助记符,如下表所示。
释放设备的所有权,这是通过OPEN命令获得的。
CLOSE device
IRIS 提供了两个预定义的助记符空间供终端使用:
^%X364 用于 ANSI X3.64 终端^%XDTM 用于 DTM PC 控制台如果激活这些助记符空间之一,则可以在WRITE /mnemonic命令中使用与它们关联的控制助记符。还可以创建自己的助记符空间。有关助记符空间的更多信息,请参阅使用助记符空间控制设备。
以下部分描述了这些助记符空间的控制助记符。
IRIS 为 ANSI X3.64 定义提供内置助记符空间。该助记符空间是管理器命名空间中的 IRIS 例程 %X364。要使用例程 %X364,请执行以下任一操作:
IRIS 系统管理员在IO Settings配置设置中输入 %X364 作为默认助记符空间。从管理门户中,选择“系统管理” 、 “配置” 、 “设备设置” 、 “IO 设置” 。OPEN命令: OPEN "terminal"::"^%X364"
下表列出了助记符。
将零个或多个字符写入终端
WRITE *variable
WRITE *-n
WRITE #
WRITE /mnemonic
| 参数 | 定义 |
|---|---|
(none) |
不带参数的WRITE将写入当前设备上的所有局部变量。 |
*variable |
WRITE *变量写入一个字符,其十进制值等于x 。对于 ASCII 字符,变量的值应为 0 到 255 范围内的整数;对于 Unicode 字符,变量的值应为 >255。按照约定,从 0 到 127 的值表示 7 位 ASCII 字符,而 128 到 255 表示扩展 ASCII 字符集,与应用程序本身相关。如果硬件和软件设置正确, IRIS 可以处理 8 位数据。示例:您可以使用第八位来表示国际字符集。 IRIS 例程通常使用WRITE *来发送设备相关功能的控制字符。示例:WRITE *27,*91,*50,*74 清除终端屏幕。 WRITE *不会更改$X或$Y ;假设WRITE *输出高度特定于输出设备。 |
*-1 |
*-1会清除输入缓冲区。它清除等待下一个READ命令的所有字符。因此,所有预先输入的字符都被清除。输入缓冲区保存从键盘到达的字符,甚至是您在例程执行 READ命令之前键入的字符。因此,甚至可以在问题出现在屏幕上之前就回答问题。 |
I O每个操作系统都会拦截某些协议字符 (UNIX) 或组合键(例如 Windows 平台上的CTR-ALT-DEL ),以防止这些字符影响 IRIS。 Windows 控制台不会尝试覆盖这些操作系统特征。
其他特殊字符可以改变例程的执行方式,但不会出现在READ命令变量中。在图像模式下操作终端会取消这些效果,并使 IRIS 像对待任何其他字符一样对待这些字符。
READ受输出和输入控制字符的影响。 READ只是读取除终止字符之外的所有其他控制字符。它不回应他们。
输出控制字符影响例程的流程和输出。下表对此进行了描述:
| 输出控制字符 | 十进制值 | 定义 |
|---|---|---|
| Ctrl-C | 3 | 如果启用了中断,则Ctrl-C会中断例程的执行。该例程的行为就像发生错误。如果禁用中断,则Ctrl-C会导致 IRIS 丢弃当前READ中迄今为止输入的任何内容。可以使用Ctrl-C中断需要网络操作的全局模块请求。要捕获Ctrl-C ,请设置特殊变量$ZTRAP 。有关其他信息,请参阅有关启用中断的部分。 |
| Ctrl-S | 19 | Ctrl-S暂停到终端的输出。当 IRIS 遇到Ctrl-Q时,终端输出将恢复。 |
| Ctrl-Q | 17 | Ctrl-Q恢复由Ctrl-S暂停的输出。 |
输入控制字符影响输入。
从键盘读取 0 到 32 KB 的内容到指定变量中。超时参数是可选的。该命令不能以井号 (#) 或冒号 (:) 结尾
READ variable:timeout ; Variable-length read
READ variable#length:timeout ; Fixed-length read
READ *variable:timeout ; Single-character read
下表提供了如何使用这些参数的几个示例。
| 例子 | 影响 |
|---|---|
READ ^GLO |
从当前设备读取字符,直到找到终止符,并将结果字符串放入全局^GLO中。 |
READ X:60 |
从当前设备读取,直到找到终止符,并将读取的字符串放入变量X中。在超时之前最多等待 60 秒输入结束。敲击按键不会重置超时值。 |
READ *X |
从当前设备读取单个字符并将其十进制值放入局部变量X中。 |
READ X#1 |
从当前设备读取单个字符并将其字符串值放入局部变量X中。 |
OPEN或USE命令中的终止符参数允许您将特定字符定义为READ或WRITE命令的终止符。这些显式终止符可用于补充指定协议提供的终止符字符。终止符参数还可用于覆盖协议对字符的指定,并将其指定为终止符。将字符重新定义为终止符的能力的例外情况是:ASCII 0 (NULL)、ASCII 3 ( Ctrl-C ) 以及两个输出控制字符Ctrl-Q (XON) 和Ctrl-S (XOFF)。它们保留其功能,并且不能重新定义为终止符。
此示例将 Z、 Backspace和Tab定义为主设备的终止符。下划线是连接运算符。
USE 0:("":"":"Z"_$CHAR(8,9))
通过对无主终端发出OPEN命令,您可以隐式清除 IRIS 内部显式终止符列表。当出现协议字符串时, IRIS 会执行以下操作:
下表给出了显式终止符字符串的示例。
| Terminator String 终止符字符串 | Definition 定义 |
|---|---|
USE 0:(80:"C":$CHAR(27)) |
转义字符终止READ,而不是开始转义序列。 |
USE 0:(80:"C":"") |
空字符串清除所有终止符。 |
OPEN 和 USE 协议定义了哪些 READ 输入字符、控制序列和击键被视为隐式终止符。这四种协议是 I(图像模式)、N(正常模式(默认))、R(读取行调用模式)和 T(终止符模式):
I(图像模式)接受所有 256 个八位字符作为数据,不将任何字符视为 READ 输入终止符或命令行编辑字符。因此,您应该在图像模式下仅使用单个字符或固定长度的READ操作。如果没有定义终止字符,普通的READ会导致错误。N(普通模式)和 C(CRT 模式)接受除以下六种字符之外的所有字符作为数据:ASCII 3、8、10、13、21 和 127。其中两种字符:ASCII 10(换行符)和 13(回车符)终止 READ 并提交输入。 ASCII 3 ( Ctrl-C ) 丢弃输入并发出如果启用 BREAK,则会出现错误。 ASCII 8(退格)和 127(删除)执行单字符退格擦除,然后继续读取。 ASCII 21 执行多字符退格,擦除所有先前的字符,然后继续读取。R(读取行调用模式)接受除以下 20 种以外的所有字符作为数据:ASCII 1 到 8、10 到 14、16、18、21、23、24、27 和 127。 ASCII 10(换行)和 13(回车) return) 终止 READ 并提交输入。特殊情况或终端可能需要不同的协议。使用协议字母代码参数(或相应的关键字参数),可以更改 IRIS 与终端通信的规则。协议对正常读取和单字符读取的影响是一样的。
禁用所有特殊协议的正常模式足以满足大多数终端 I/O 的需要。在正常模式下,IRIS 会回显每个传入的 ASCII 字符,并将其发送回以显示在终端上。 Return或有效的转义序列结束READ命令。
对终端发出OPEN会关闭所有先前的协议,除非您使用 + 和 - 选项。
下表描述了有效的协议字符及其效果。
| 协议字符 | 姓名 | 定义 |
|---|---|---|
| B | BREAK | 如果启用了中断 (+B),则Ctrl-C将中断正在运行的例程并使用错误。如果禁用中断 (-B),则Ctrl-C不会引起中断,并且不会显示“^C”。该协议的使用取决于登录模式默认建立的BREAK命令,如下:如果以程序员模式登录,则始终启用中断 ( BREAK 1 )。 OPEN或USE命令中指定的 B(或 /BREAK)协议无效。如果以应用程序模式登录,则默认为 BREAK 0 ,并且可以通过OPEN或USE命令中指定的 B(或 /BREAK)协议来启用或禁用中断。 |
OPEN 和 USE 命令的关键字参数下表描述了使用OPEN和USE命令控制终端设备的关键字参数。对于每个关键字,该表列出了OPEN和USE相应的字母代码协议。有关使用这些协议的其他信息可以在字母代码协议表中找到。
OPEN 和 USE 关键字参数| 关键词 | 默认 | 字母代码协议 | 描述 |
|---|---|---|---|
/BAUD=n |
/BAUD= n设置端口的调制解调器波特率。支持的值取决于操作系统支持。 /SPEED 是 /BAUD 的别名。 |
||
/BREAK[=n] /BREAK[= n ] |
0 | B | /BREAK 或 /BREAK= n (对于n的非零值)启用协议。 /BREAK= n如果n值为零,则会禁用协议。 |
| /COMPARAMS=str | 对应于portstate位置参数。 (此关键字提供了一种以与位置无关的方式指定 COM 端口状态字节代码字符串的方法。)可以包含在str中的端口状态字节代码列在本页前面的表中。 |
||
| /COMPRESS=str | "" | 指定流数据压缩类型。可以启用 ZLIB 或 ZSTD 压缩类型。可以指定/COMPRESS=""来禁用压缩。 /COMPRESS="zlib"相当于/GZIP=1 。要压缩字符串,请使用 %SYSTEM.Util.Compress(). |
第三个位置参数:最多八个字符的字符串,其中任何一个都将终止READ 。这些终止符是协议中内置终止符的补充。请参阅使用终止符结束 I/O 操作。
portstate 第 4 个位置参数:按位置顺序最多包含 8 个字节的字符串,用于控制 COM 端口状态。端口状态字节如下(字节从1开始按从左到右的顺序编号):
| Byte 字节 | 意义 | Values |
|---|---|---|
| 1 | Disconnect 断开 |
D=断开(挂断)端口。空白=不断开端口。 |
| 2 | Modem Control 调制解调器控制 | 1=使用调制解调器控制。0=不使用调制解调器控制。空白=调制解调器控制没有变化。 |
| 3 | Data Bits 数据位 | 5=五个数据位。 6=六个数据位。 7=七个数据位。 8=八个数据位。空白=数据位设置没有变化。 |
| 4 | Parity 平价 | 0=无奇偶校验。 1=奇校验。 2=偶校验。 3=标记奇偶校验。 4=空间奇偶校验。空白=奇偶校验设置没有更改。 |
| 5 | Stop Bits 停止位 |
1=一个停止位。 5=1.5 个停止位。2=两个停止位。空白=停止位设置没有变化。 |
| 6 | Flow Control 流量控制 |
X=使用Xon/Xoff流量控制。 C=使用CTS/RTS流量控制。 D=使用DSR/DTR流量控制。 N=禁用流量控制。 |
使指定终端成为当前设备。在编程器模式下,同一行代码上的所有后续 I/O 命令都引用该设备。在应用程序模式下,您在USE命令中命名的设备将一直保留为当前设备,直到下一个USE命令为止。
USE 语法USE命令采用以下参数:
USE terminal:(margin:protocols:terminator):"mnespace"
终端参数可以是一个表达式,其值为终端设备的名称。零 (0) 是该进程的主要设备。 $IO是当前设备。终端的最大长度为 256 个字符。
参数由冒号 (:) 分隔。如果省略参数,则必须指定冒号。命令或其参数列表不得以冒号结束。
可选参数列表包含在括号中,可以包含margin 、 protocols和terminator参数。可以将可选的margin 、 ports和terminator参数指定为位置参数(按所示顺序),或使用语法 /KEYWORD=value 指定为关键字参数。关键字参数可以按任意顺序指定;由于 IRIS 按从左到右的顺序执行参数,因此在某些情况下,参数之间的交互可能决定首选顺序。可以在同一参数列表中混合位置参数和关键字参数。如果指定多个参数,则需要使用括号。
要使用USE命令指定 COM 端口状态和波特率,请使用适当的关键字参数。
✓ 十一月有 32 位新成员加入
✓ 所有时间发布了 2,284 篇帖子
✓ 所有时间有 2,071 位成员加入
$ZB 显示结束读取的内容$ZB显示当前设备上最后一次READ操作结束的字符序列或事件。不能设置$ZB ;每次执行READ时,IRIS 都会设置$ZB的值。可以使用此值来作用于不可打印的字符,例如向上箭头键或功能键。
$ZB可以包含以下任意内容:
READ x#y的字符数yREAD *x的单个字符$ZB永远不会包含超过 64 个字符。较长的转义序列无效。
$ZB 示例以下示例将用户指定的输入字符分配给READ命令变量x ,并将输入终止符(通常是 Return 字符)分配给$ZB特殊变量。从终端提示符发出此命令时,您需要设置一个变量以在与READ命令相同的命令行上捕获$ZB的值。这是因为用于发出命令行的行返回被写入$ZB作为终止符。此示例使用ZZDUMP显示$ZB捕获的字符的值。
USER>READ x SET y=$ZB
USER>ZZDUMP y
0000: 0D
USER>
OPEN 命令建立终端的所有权。可选参数列表可以设置右边距、指定设备协议以及指定一个或多个终止字符。在参数列表之后,可以选择指定超时参数和/或mnespace参数。
$X 的转义序列更新要选择非默认行为来更新进程的$X ,请发出%SYSTEM.Process类的 DX( n ) 方法。
系统管理员可以通过类中设置 Config.Miscellaneous 的DX属性来更改系统范围的默认行为。
在这两种情况下, n 的值都在 0 到 4 之间,如下所示:
| Value | Default Behavior for Updating $X |
|---|---|
| 0 | Default for InterSystems IRIS |
| 1 | DSM behavior |
| 2 | DTM/MSM behavior |
$TEST特殊变量由采用超时值的命令设置。这些命令包括OPEN和READ 。 $TEST的值可以设置为 1 或 0:
$TEST设置为 1。$TEST将设置为 0。注:没有超时的OPEN和READ命令对$TEST没有影响。
$ZA 显示读取状态$ZA特殊变量包含许多位标志,显示当前设备上最后一次READ的状态。不能设置$ZA ; IRIS 控制其价值。 $ZA在下一次READ之前保持有效。 $ZA包含表中列出的值的总和,这显示了程序如何测试此变量。 ( $ZA还包含调制解调器连接状态的位标志,此处未列出。
WRITE *不会更改$X和$Y 。因此,可以将控制序列发送到终端, $X和$Y仍将反映真实的光标位置。某些控制序列确实会移动光标,因此可以在需要时直接设置$X或$Y 。
$X 和 $Y 示例在以下示例中,控制序列将 VT100 终端中的光标移动到第 10 行、第 20 列,并相应地设置$X和$Y 。
; set DY and DX to desired
; values for $Y and $X
SET DY=10
SET DX=20
; ...
; escape sequence moves
; cursor to desired position
WRITE *27, *91, DY+1, *59, DX+1, *72
; ...
; updates $X and $Y
SET $Y=DY
SET $X=DX
$X 和 $Y的影响各不相同转义序列可以改变$X和$Y值上的回显效果。三个因素控制着这种影响:
OPEN或USE命令中指定了 /NOXY(禁用$X和$Y处理)。%SYSTEM.Process类的 DX() 方法来设置$X如何处理当前进程的转义序列。可以通过类中设置 ObjectScript 提供支持串行异步 ASCII 终端的命令。还可以将这些命令与控制台 I/O 结合使用。
使用终端 I/O,例程可以:
ANSI 标准转义序列。Ctrl-C中断的识别。XON ( Ctrl-Q ) 和 XOFF ( Ctrl-S ) 控制传入和传出数据流。COM 端口状态参数和调制解调器波特率。在大多数平台上,打印机被视为终端 I/O 设备。 UNIX® 系统始终将打印机作为终端 I/O 设备来处理。在 Windows 上,通过串行通信端口连接的打印机被视为终端 I/O 设备。否则,Windows 系统将打印机作为顺序文件 I/O 设备处理。
登录 IRIS 的终端或控制台是主要设备。无需打开主要设备。如果尚未发出OPEN和USE ,则进程第一次发出READ或WRITE时,系统会自动打开主设备,并将其设置为当前设备,就像您已显式发出OPEN 0 USE 0一样。
在本页的其余部分中, “终端”一词用于指代终端和控制台。
I/O 条件I/O 命令可以影响特殊变量的值。
UDP 支持 IPv4 和 IPv6 互联网协议。由于这些协议不兼容,服务器和客户端都必须使用相同的Internet协议,否则传输将失败。
IPv4 地址具有以下格式。 n是 0 到 255 范围内的十进制整数:
n.n.n.n
可以将 IPv4 协议指定为"0.0.0.0" 。
IPv6 地址具有以下完整格式。 h是一个具有四个十六进制数字的十六进制数:
h:h:h:h:h:h:h:h
通常,IPv6 地址的缩写方式是消除前导零并用双冒号 (::) 替换连续的零部分; IPv6 地址中只能使用一个双冒号。通过使用 IPv4 缩写规则,可以将 IPv6 协议指定为“::” (意味着所有 8 个h部分的值为 0000)。
建立互联网协议:
%New() 方法中建立 IPv4 或 IPv6。默认为 IPv4。GetHostAddr()方法中指定并在Send()方法中提供(以二进制形式)的 IPv4 或 IPv6 协议匹配。以下是 IPv4 传输:
Server
SET sobj=##class(%Net.UDP).%New(3001,"127.0.0.1")
SET inmsg=sobj.Recv()
Client
SET cobj=##class(%Net.UDP).本页介绍如何使用 UDP 在进程之间建立远程通信。
通过%Net.UDP来支持 UDP。此类提供以下方法: Send()数据包到指定的目的地和端口、 Recv()来自套接字的数据包以及Reply()发送器最后收到的数据包。
目标被标识为本地主机名或者 IPv4 或 IPv6 主机地址。该端口可以是指定的端口号或动态端口分配。
UDP套接字要使用 UDP,必须使用%New()方法来创建 UDP 套接字对象。然后,该对象实例用于发送、接收和回复数据包传输。
创建 UDP 套接字对象时,可以指定端口号和主机地址,如下例所示:
SET UPDOref=##class(%Net.UDP).%New(3001,"0.0.0.0")
端口号和主机地址都是可选的。 %New()方法返回 UDP 套接字对象实例的 OREF(对象引用)。
UDP 对象时,它必须定义接收请求的端口号。UDP 对象时,它可以使用动态端口号。默认值为0。当它发送数据包时,必须指定提供者的主机名和端口号。Send()方法指定目标的二进制地址。这是主机地址的二进制版本。
本页讨论使用 TCP/IP 在 IRIS 数据平台进程之间进行通信的几个高级主题。
服务器一次仅维护一个连接。如果在另一个连接打开时第二个客户端尝试连接,TCP/IP 会将该客户端放入队列中。在队列中时,第二个客户端可以向端口写入数据,就像已连接一样。第二个客户端写入的数据保留在缓冲区中,直到第一个连接关闭并且第二个客户端连接为止。
如果第二个客户端在连接存在之前发出READ,则会挂起。当第二个客户端在队列中时,第三个客户端的任何连接尝试都会失败。
如果已经打开 TCP 设备的客户端在第一个连接仍然存在时尝试第二次连接,则第二个OPEN命令会导致错误。将这种情况视为错误而不是USE命令可以防止出现意外的结果。如果错误的程序认为它已打开新连接,而实际上它正在重用可能具有不同目标或不同参数的现有连接,则可能会出现此类意外结果。
TCP 设备的作业命令可以使用JOB命令来实现TCP并发服务器。 TCP 并发服务器允许同时为多个客户端提供服务。在这种模式下,客户端不必等待服务器完成为其他客户端提供服务。相反,每次客户端请求服务器时,它都会为该客户端生成一个单独的子作业,只要客户端需要它,该子作业就会保持打开状态。一旦生成该子作业(由JOB命令的返回指示),另一个客户端就可以请求服务,并且服务器也将为该客户端创建一个子作业。
非并发和并发模式下的客户端/服务器连接。
如果正在编写一个IRIS服务器来与无法控制的客户端连接,则服务器进程必须发出CLOSE命令来关闭TCP连接。就 IRIS而言,CLOSE命令确实会关闭连接,但是在内部TCP/IP会在服务器上为这个连接保留最长两分钟的资源。
当jobserver用于为TCP/IP作业提供服务时,可能会产生意想不到的结果。当一个JOBSERVER进程执行暂停时,该进程立即返回到可用的JOBSERVER进程池,但其资源在内部保留最多两分钟。由于JOBSERVER进程是在第一个可用的基础上分配的,因此来自数量相对较少的客户机的重载可能会耗尽JOBSERVER进程的资源。
为了避免这个问题,在JOBSERVER下运行的JOB打开的TCP/IP服务器应该显式地发出一个CLOSE命令,然后在最后的QUIT或HALT)命令之前发出一个简短的HANG命令。根据TCP/IP规范,需要一个HANG 120来保证在JOBSERVER的转世之间没有资源仍在使用。在实践中,一秒的HANG通常足以在JOBSERVER进程之间均匀地分配资源负载。
在某些情况下,TCP会将不同的记录连接在一起形成单个记录。如果客户端或服务器进程向一个由WRITE分隔的TCP端口发出一系列WRITE命令,则可能会发生串接!或用于刷新缓冲区的WRITE#命令,而不管读命令是否在连接的另一端等待。
Process A Process B
%SYS> USE "|TCP|41880" R A U 0 W A %SYS> USE "|TCP|41880" WRITE "ONE",!,"TWO"
<RETURN> <RETURN>
ONE
%SYS> USE 41880 R A U 0 W A
<RETURN>
TWO
第二个例子概述了在进程B完成将两条记录写入到TCP端口之后,当它发出读命令时,进程A如何接收一条串联的记录。
Process A Process B
. %SYS> USE "|TCP|41880" WRITE "ONE",!,"TWO"
..png)
当我们将 InterSystems IRIS 安装在Windows 系列操作系统中时,往往同时使用IIS 作为其Web 服务器。
但这时候我们却发现,由RESTful返回的错误信息却不能正常显示出来了,特别是在调试程序的时候,非常不方便。
比如在测试 FHIR Post/Put 请求时,我们的请求消息体中包含不正确的内容,这时我可以看到返回的是HTTP 400 Bad Request的返回内容.
我无法具体知道请求消息体哪句出错了,这对我调试程序造成很大困扰。
解决方法:
1. 打开IIS的管理页面,双击 错误页
.png)
2. 选择右侧 编辑功能设置
.png)
3. 选择错误响应下的 详细错误 选项。
.png)
我们再次请求,此时可以看到页面上显示了详细的错误信息
.png)
相关详细信息可以查看文档:Configuring IIS to Return SOAP Fault Details 以及 HTTP Errors
以下示例显示了一个非常简单的并发服务器,只要它检测到来自客户端的连接,就会产生一个子作业。 JOB指定一个并发服务器位开关值(值16)并通过符号表(值1):16+1=17。
server
SET io="|TCP|1"
SET ^serverport=7001
OPEN io:(:^serverport:"MA"):200
IF ('$TEST) {
WRITE !,"Cannot open server port"
QUIT }
ELSE { WRITE !,"Server port opened" }
loop
USE io READ x ; Read for accept
USE 0 WRITE !,"Accepted connection"
JOB child:(:17:io:io) ;Concurrent server bit is on
GOTO loop
child
WRITE $JOB,! ; Send job id on TCP device to be read by client
QUIT
client
SET io="|TCP|2"
SET host="127.0.