2016-07-22 28 views
1

我創建了以下觸發器來跟蹤postgres表上的所有更改。Postgresql LISTEN/NOTIFY回顧

DROP TRIGGER tr_request_update_notify ON requests; 

CREATE OR REPLACE FUNCTION request_update_notify() RETURNS trigger as $$ 
BEGIN 
    PERFORM pg_notify('request_update_notify', json_build_object('table', TG_TABLE_NAME, 'id', NEW.id, 'event', NEW.event, 'type', TG_OP)::text); 
    RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 


CREATE TRIGGER tr_request_update_notify AFTER UPDATE or INSERT ON requests FOR EACH ROW EXECUTE PROCEDURE request_update_notify(); 

另一個應用程序將偵聽連接併爲每個事件應用適當的處理。

如果發生事件並且我的應用程序未啓動,則該事件將不會被處理。有沒有辦法對所有錯過的通知進行回顧?

回答

2

通知不存儲在任何地方,它們只是發送到正在同一通知通道上偵聽的任何會話。但是,當你看到你在數據庫中時,爲什麼不把通知存儲在一個表中,然後監聽器只是在它們處於活動狀態時輪詢該表。然後您也可以直接使用json而不是將它投射到text。不像「NOTIFY/LISTEN」那樣是「自動的」,但是其他方面非常簡單。

CREATE OR REPLACE FUNCTION request_update_notify() RETURNS trigger as $$ 
BEGIN 
    INSERT INTO my_notifications (channel, message_time, notification) 
    VALUES ('request_update_notify', CURRENT_TIME, 
      json_build_object('table', TG_TABLE_NAME, 
          'id', NEW.id, 
          'event', NEW.event, 
          'type', TG_OP) 
); 
    RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 
+0

甚至合併表的想法和通知所以新的事件來通知和舊的可以從表中讀取。這樣就不需要輪詢 –

+0

使用NOTIFY/LISTEN的想法是避免輪詢表。我可能會部分使用建議的解決方案並管理序列號。因此,在啓動時,我的應用程序會處理所有錯過的通知(可以使用序號找出),然後再次聽DB。 – Charmi