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索引页

磨砺技术珠矶,践行数据之道,追求卓越价值

posted @ 2012-07-13 16:10  健哥的数据花园  阅读(502)  评论(0编辑  收藏