zoukankan      html  css  js  c++  java
  • 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索引页

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

  • 相关阅读:
    RecyclerView+CardView简单使用
    Android六大进程间通信方式总结之一:基本知识
    前台服务
    Notification
    SQLite的基本用法
    SharePreferences基本用法
    自定义控件和使用的两种基本方法
    AsyncTask的简单使用
    Java Servlet调用数据库复习
    JDBC数据源(DataSource)的简单实现
  • 原文地址:https://www.cnblogs.com/gaojian/p/2590430.html
Copyright © 2011-2022 走看看