Do obsługi powiadomień z bazy PostgreSQL oprogramowanie GRAVITY wykorzystuje mechanizm pg_notify serwera bazy danych.
Jest to wbudowana funkcja, która jako parametry przyjmuje dwa argumenty: channel i payload (zobacz dokumentację: PostgreSQL).
Channel to kanał, na którym będzie nasłuchiwać gravity, natomiast 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 takim przypadku 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 następującej 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 notyfikację 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, po dodaniu rekordu 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 nasłuchujący na tym kanale, uruchomi on projekt z parametrami odpowiadającymi polom obiektu JSON, który został przesłany w ładunku notyfikacji.
Jeśli chcemy użyć operatora INPUT DATA w projekcie w celu odebrania informacji z wysłanej notyfikacji, funkcja pg_notify powinna być zdefiniowana w następujący sposób:
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;i tym samym 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 którym będzie odbywał się nasłuch.
- Wykorzystaj parametry o nazwach odpowiadających strukturze obiektu JSON w ładunku notyfikacji lub operator INPUT DATA.