24.06.2022

Trigger, Notify, Listen

 

PostgreSQL Veri Tabanı Yönetim Sistemi (VTYS ya da İngilizce kısaltmasıyla RDBMS) kullanırken bir tabloya yeni kayıt eklendiğinde ya da bir kayıt güncellendiğinde uzaktaki bir kaynağa erişmek, bir API metodu çağırmak gibi işlemler yapmak isterseniz PostgreSQL'in notification sistemini kullanabilirsiniz.

NOTIFY ve LISTEN ile ilgili detaylı bilgiye linklerden ulaşabilirsiniz. Özetle NOTIFY bir notification gönderilmesini, LISTEN ise gönderilen notificationların alınmasını sağlıyor.

Nasıl kullanılacağını örnek bir Javascript uygulaması ile göstermeye çalışacağım ama öncelikle bir veri tabanı ve bir tabloya ihtiyacımız var. Tablonun ne olduğu aslında önemli değil ama aşağıdaki gibi bir tablo oluşturabilirsiniz.

DROP SEQUENCE IF EXISTS "public"."post_id_seq";
CREATE SEQUENCE "public"."post_id_seq" 
INCREMENT 1
MINVALUE  1
MAXVALUE 9223372036854775807
START 1
CACHE 1;

DROP TABLE IF EXISTS "public"."post";
CREATE TABLE "public"."post" (
  "id" int8 NOT NULL DEFAULT nextval('post_id_seq'::regclass),
  "title" varchar(255) COLLATE "pg_catalog"."default",
  "content" text COLLATE "pg_catalog"."default",
  "create_date" date DEFAULT now()
);

ALTER TABLE "public"."post" ADD CONSTRAINT "post_pkey" PRIMARY KEY ("id");

Ayrıca notification'ı gönderecek bir fonksiyona ve bu fonksiyonu istenen INSERT işlemi sonrasında çağıracak olan bir trigger'a ihtiyacımız olacak.

DROP FUNCTION IF EXISTS "public"."notify_new_post"();
CREATE OR REPLACE FUNCTION "public"."notify_new_post"()
  RETURNS "pg_catalog"."trigger" AS $BODY$
begin
  PERFORM pg_notify('new_post_event', row_to_json(NEW)::text);
  RETURN NULL;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

CREATE TRIGGER "notify_new_post_trigger" AFTER INSERT ON "public"."post"
FOR EACH ROW
EXECUTE PROCEDURE "public"."notify_new_post"();

notify_new_post_trigger isimli trigger, post tablosuna yeni bir kayıt insert edildikten sonra notify_new_post fonksiyonunu çağırıyor. Bu fonksiyon pg_notify fonksiyonunu kullanarak yeni bir notification oluşturuyor.

Sıra dinlemeye geldi. Basit bir Javascript kodu yazarak gönderilen notificationları dinleyip insert edilen kayıtları konsola yazalım. Aşağıdaki kodu `index.js` dosyasına kaydedip `npm init -y` ve `npm install pg` komutları ile veri tabanı bağlantısı için gerekli paketi kurabilir, `node .\index.js` komutu ile çalıştırabilirsiniz. Elbette sisteminizde node kurulu olmalı ve config nesnesi içindeki bağlantı bilgilerini de kendinize uygun şekilde değiştirmelisiniz.

const pg = require('pg');

const config = {
    user: 'user',
    password: 'password',
    host: 'localhost',
    db: 'db',
};

const connectionString = `postgres://${config.user}:${config.password}@${config.host}/${config.db}`;

const pgClient = new pg.Client(connectionString);

pgClient.connect();

const query = pgClient.query('LISTEN new_post_event');

pgClient.on('notification', async (data) => {
    const payload = JSON.parse(data.payload);
    console.log('New Post!', payload);
});

yukarıdaki kod çalışır haldeyken post tablosuna yeni bir kayıt eklediğinizdeki aşağıdaki gibi konsola eklenen kaydın bilgilerinin yazıldığını göreceksiniz.









Çok farklı şekillerde kullanılabilir. Örneğin: yeni eklenen kayıt ile ilgili bir Tweet atmak için API'a request gönderebilir,  önceden belirlenmiş kullanıcılara bildirim gönderebilirsiniz.

Esen kalın.

29.04.2022

Zaman akıp gidiyor...

Bir gün varsın, bir gün yoksun...

Geride bıraktıkların konuşulacak hep ta ki anılar solana, her şey unutulana kadar.

Sonra yine bir gün bir dost diyecek ki; "Hatırlar mısın?" Öyle bahsedeceğiz hatırladığımız kadar. Nostalji olacak bir zamanın gerçeklerinden kalan izler.

Bir kısmı doğru olacak hatırlananların. Kalanı hikayeleşecek. Kapılardan sığmayan cüsseler, akıl almaz bir zeka. Çok iyiydi diyeceğiz. Pek iyiydi. Kimse hatırlayacak mı ne istediğini? Ne düşündüğünü? Nasıl hissettiğini?

Söz uçar, yazı kalır. Tek umut kalan parçaların yazılanların arasına karışmış olması.

22.07.2020

Java Timer Sınıfı Hakkında...

Geliştirdiğimiz uygulamalar içerisinde belirli aralıklarla sürekli çalışmasını istediğimiz işler olabiliyor. Bu durumda genellikle Quartz ya da aynı işi kullanan bir başka yazılım/kütüphane kullanıyoruz. Çoğu zaman da etkin bir şekilde görev yerine getiriliyor.

Java'nın Timer ve TimerTask sınıflarını kullanarak da bu işi gerçekleştirmek mümkün. Elbette Quartz ve benzeri yazılımlar bu konuda çok ilerlemiş durumda ve muhtemelen işinizi halletmek için bu yazılımlardan birini kullanmalısınız. Bu örnek tamamen öğrenme amaçlı. :)

24.06.2020

Sinerji

Sinerji derken, Gora'da Engin Günaydın'ın bahsettiği sinerjiden bahsetmiyorum. Klavye ve farenizi birden fazla bilgisayarda kullanmanızı sağlayan Synergy'den bahsediyorum. Symless tarafından geliştirilen yazılım klavye ve farenizi paylaştırmak istediğiniz iki bilgisayara da kuruluyor.Yazılımı bir bilgisayarda server (sunucu) diğerinde client (istemci) olarak ayarlıyorsunuz. Ekranlarınızı masanızın üzerinde durdukları şekliyle yerleştiriyorsunuz ve klavyenizle fareniz iki bilgisayarda da çalışıyor. Üstelik clipboard da paylaşabiliyorsunuz. Bundan kopyalayayım. Hop! Öbürüne yapıştırayım. Prayslıs.


Geçtiğimiz aylarda, kullandığım PC'nin bana ayar vermesini de göz önüne alarak bazı işlerimi Canavar'a taşıdım. Aldığım cihazın tek bir monitör çıkışı var. Ben ise masamın her yeri monitör dolu olsun istiyorum. Öyle seviyorum. Beni yargılamayın. Şimdi hem tüm monitörlerimi kullanabiliyorum hem de iki bilgisayar arasında geçiş inanılmaz kolaylaşmış durumda.