接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端)。
本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/07/13/2590430.html,如需转载请自行联系原作者