Q 语言 - 消息处理程序

q进程通过进程间通信连接到另一个q进程时,它由消息处理程序处理。 这些消息处理程序具有默认行为。 例如,在同步消息处理的情况下,处理程序返回查询的值。 本例中的同步处理程序是 .z.pg,我们可以根据要求重写它。

Kdb+ 进程有几个预定义的消息处理程序。 消息处理程序对于配置数据库很重要。 一些用法包括 −

  • 日志记录 − 记录传入消息(在发生任何致命错误时很有帮助),

  • 安全性 − 根据用户名/IP 地址允许/禁止访问数据库、某些函数调用等。 它有助于仅向授权订阅者提供访问权限。

  • 处理与其他进程的连接/断开连接

预定义消息处理程序

下面讨论一些预定义的消息处理程序。

.z.pg

它是一个同步消息处理程序(process get)。 每当 kdb+ 实例上收到同步消息时,就会自动调用此函数。

参数是要执行的字符串/函数调用,即传递的消息。 默认情况下,定义如下 −

.z.pg: {value x}                / simply execute the message 
                                received but we can overwrite it to
give any customized result.
.z.pg : {handle::.z.w;value x}  / this will store the remote handle
.z.pg : {show .z.w;value x}     / this will show the remote handle

.z.ps

它是一个异步消息处理程序(进程集)。 它是异步消息的等效处理程序。 参数是要执行的字符串/函数调用。 默认情况下,它定义为,

.z.pg : {value x}        / Can be overriden for a customized action.

以下是异步消息的自定义消息处理程序,其中我们使用了受保护的执行,

.z.pg: {@[value; x; errhandler x]}

这里errhandler是一个在发生意外错误时使用的函数。

.z.po[]

它是一个连接打开处理程序(process-open)。 当远程进程打开连接时执行它。 要在打开进程连接时查看句柄,我们可以将 .z.po 定义为:

.z.po : {Show “Connection opened by” , string h: .z.h}

.z.pc[]

它是一个关闭连接处理程序(process-close)。 当连接关闭时调用它。 我们可以创建自己的关闭处理程序,它可以将全局连接句柄重置为 0,并发出命令将计时器设置为每 3 秒(3000 毫秒)触发(执行)一次。

.z.pc : { h::0; value “\t 3000”} 

计时器处理程序 (.z.ts) 尝试重新打开连接。 成功后,它会关闭计时器。

.z.ts : { h:: hopen `::5001; if [h>0; value “\t 0”] }

.z.pi[]

PI 代表过程输入。 任何类型的输入都会调用它。 它可用于处理控制台输入或远程客户端输入。 使用 .z.pi[],可以验证控制台输入或替换默认显示。 此外,它还可用于任何类型的日志记录操作。

q).z.pi
'.z.pi

q).z.pi:{">", .Q.s value x}

q)5+4
>9

q)30+42
>72

q)30*2
>60

q)\x .z.pi
>q)

q)5+4
9

.z.pw

它是一个验证连接处理程序(用户身份验证)。 当打开 kdb+ 会话的连接时,它会添加额外的回调。 它在 –u/-U 检查之后、.z.po(端口打开)之前调用。

.z.pw : {[user_id;passwd] 1b}

输入为用户ID(符号)和密码(文本)。