PostgreSQL的notify 与listen (七)
磨砺技术珠矶,践行数据之道,追求卓越价值
回到上一级页面: PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页
接PostgreSQL的notify 与listen (六)的内容,探讨一下谁真正接受notify 消息。
修改PostgreSQL的源代码:src/backend/command/async.c:
NotifyMyFrontEnd(const char *channel, const char *payload, int32 srcPid)函数
if (whereToSendOutput == DestRemote) { StringInfoData buf; pq_beginmessage(&buf, 'A'); pq_sendint(&buf, srcPid, sizeof(int32)); pq_sendstring(&buf, channel); if (PG_PROTOCOL_MAJOR(FrontendProtocol) >= 3) pq_sendstring(&buf, payload); pq_endmessage(&buf); //added by gaojian begin elog(WARNING, "NotifyMyFrontEnd, srcPid is: %d", srcPid);
elog(WARNING, "NotifyMyFrontEnd, my Pid is: %d", getpid());
//added by gaojian end
......
}
启动 postgres, 执行 ps -ef|grep postgres
开session A(用作listen 端), psql:
postgres#listen gaojian;
postgres#
再来看 ps -ef|grep postgre: 进程号27764/父进程号27695的 名为postgres的进程已启动。
开session B(用作notify 端),psql:
postgres#notify gaojian;
postgres#
再来看 ps -ef|grep postgre: 进程号27857/父进程号27695 的 名为postgres的进程已启动。
再回到session A, 随便执行一条命令:
postgres#select current_date;
警告 In NotifyMyFrontEnd srcPid is 27857
警告 In NotifyMyFrontEnd my Pid is 27764
-----date-----
2012-07-13
收到来自伺服器 "gaojian" 进程PID 27875 非同步通知
postgres#
这表明 信息的发送者实际上是 和notify 端对应的 后台postgres进程。信息的接受者首先也是和listen端对应的后台postgres进程,由此进程把消息推送给 前台psql(listen端)。
回到上一级页面: PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页
磨砺技术珠矶,践行数据之道,追求卓越价值