Do obsługi powiadomień z bazy PostgreSQL programowanie GRAVITY wykorzystuje
mechanizm pg_notify
serwera bazy danych.
Jest to wbudowana funkcja, która jako parametry przyjmuje dwa argumenty: channel i payload https://www.postgresql.org/docs/current/sql-notify.html
Channel to kanał na jakim będzie nasłuchiwać gravity, payload to informacja jaka zostanie odebrana i musi być przesłana w formacie JSON jako obiekt składający się z właściwości klucz: wartość. Każda właściwość zostanie przekazana do projektu uruchomionego przez trigger jako parametr i jeśli projekt ma zdefiniowany parametr o nazwie odpowiadającej kluczowi zostanie uzupełniona jego wartością.
Możliwe jest również przekazanie wartości do operatora DATA INPUT wówczas kluczem jest nazwa operatora, a wartością obiekt JSON odpowiadający szablonowi zdefiniowanemu na operatorze.
Konfiguracja serwera bazy danych
Ponieważ pg_notify
jest funkcją i zamierzamy reagować na zmianę rekordu w konkretnej
tabeli w bazie najprostszym podejściem jest użycie triggera na tabeli bazy danych.
Załóżmy, że istnieje tabela o strukturze:
CREATE TABLE etl.articles
(
id integer,
name character(100),
)
WITH (
OIDS=FALSE
);
Zamierzamy uruchomić projekt za każdym razem, gdy zostanie dodany nowy lub zmodyfikowany towar w tabeli.
Zdefiniujmy funkcję odpowiedzialną za wysyłanie notyfikacji
CREATE OR REPLACE FUNCTION etl.notify_articles_add()
RETURNS trigger AS
$BODY$
BEGIN
PERFORM pg_notify(
'notify_articles_add',
json_build_object(
'id', NEW.id,
'name', NEW.name)::text
);
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
funkcja wyśle notyfikacje na kanale notify_articles_add
z ładunkiem
{
‘id’: [id nowego rekordu],
‘name’: [nazwa towaru]
}
Zdefiniujmy triggera dla tabeli articles
CREATE TRIGGER trigger_notify_articles_add
AFTER INSERT OR UPDATE
ON etl.articles
FOR EACH ROW
EXECUTE PROCEDURE etl.notify_articles_add();
W tym momencie dodając rekord do tabeli articles
zdefiniowany trigger wywoła funkcję notify_articles_add
, która wyśle notyfikację na kanale notify_articles_add
.
Jeśli w systemie GRAVITY jest zdefiniowany trigger, który nasłuchuje na wskazanym kanale uruchomi projekt z parametrami jakie odpowiadają polom obiektu JSON, który wysyła w swoim ładunku notyfikacja.
Jeśli chcemy użyć operatora INPUT DATA na projekcie, w celu odebrania informacji z wysłanej notyfikacji, funkcja pg_notify
powinna być zdefiniowana następująco
CREATE OR REPLACE FUNCTION etl.notify_articles_add()
RETURNS trigger AS
$BODY$
BEGIN
PERFORM pg_notify(
'notify_articles_add',
json_build_object(
'InputData1',
json_build_object(
'id', NEW.id,
'name', NEW.name,
)::text)::text
);
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
czyli przekazywać obiekt JSON o strukturze
{
InputData1: {
"id": [id_nowego_rekodu],
"name": "[nazwa towaru]"
}
}
gdzie InputData1
jest nazwą operatora DATA INPUT i operator DATA INPUT ma zdefiniowany szablon danych odpowiadający obiektowi InputData1
Konfiguracja systemu GRAVITY
- Konfigurując trigger dla projektu po wybraniu połączenia do bazy danych korzystającego z PostgreSQL wpisz kanał na jakim odbywać się będzie nasłuch.
- Wykorzystaj parametry o nazwach odpowiadających strukturze obiektu JSON w ładunku notyfikacji lub operator INPUT DATA.