Logo
    Pobierz gravity.integration

    Search

    Home

    Informacje podstawowe

    Dokumentacja techniczna

    Przykłady zastosowań

    gravity.integration
    gravity.integration
    /Dokumentacja techniczna
    Dokumentacja techniczna
    /Wywołanie procesu GRAVITY
    Wywołanie procesu GRAVITY
    /
    Wywołanie automatyczne przez mechanizm notyfikacji bazy danych
    /Konfiguracja notyfikacji dla PostgreSQL
    Konfiguracja notyfikacji dla PostgreSQL
    Konfiguracja notyfikacji dla PostgreSQL

    Konfiguracja notyfikacji dla PostgreSQL

    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.