Skip to main content

Inbox Mesajları ve Zamanlanmış Sorgular

İçindekiler​


Genel Bakış​

MMX Notificator, iki temel yöntemle bildirim gönderir:

  • Anlık bildirim: Bir olay tetiklendiğinde (örn. sipariş oluşturulması) sistem doğrudan mesaj gönderir.
  • Zamanlanmış bildirim: Belirli aralıklarla çalıştırılan bir SQL sorgusu, ilgili kayıtları bulur ve bunları Inbox Mesajı olarak kuyruğa ekler. Kuyruk işleyici arka planda mesajları okuyup gönderir.

Bu dokümanda ikinci yöntem (zamanlanmış bildirim) ve Inbox Mesajı kavramı ayrıntılı olarak açıklanmaktadır.


Arayüz Sayfaları​

Aşağıdaki tabloda sistemin yönetim arayüzüne ait sayfa adresleri yer almaktadır.

SayfaURLAçıklama
Sağlayıcı Listesi/ProvidersE-posta sağlayıcılarını listeler ve yönetir
Şablon Listesi/TemplateMesaj şablonlarını listeler ve yönetir
Zamanlanmış Sorgu Listesi/ScheduledInboxQueryZamanlanmış sorgu tanımlarını listeler
Zamanlanmış Sorgu Oluştur/ScheduledInboxQuery/CreateYeni bir zamanlanmış sorgu tanımı oluşturur
Zamanlanmış Sorgu Düzenle/ScheduledInboxQuery/EditMevcut bir zamanlanmış sorgu tanımını düzenler

Mesaj Şablonları ve Parametreler​

Her bildirim bir Mesaj Şablonu (MessageTemplate) üzerine kuruludur. Şablon şu bilgileri içerir:

AlanAçıklama
KodŞablonu tanımlayan benzersiz kısa ad
AçıklamaŞablonun ne için kullanıldığının açıklaması
KonuE-posta konusu; içinde yer tutucu kullanılabilir
GövdeE-posta gövdesi; içinde yer tutucu kullanılabilir
SağlayıcıMesajın hangi e-posta sunucusu üzerinden gönderileceği
Alıcı YapılandırmasıMesajın kime gönderileceği (kullanıcı, personel, özel SQL vs.)
ParametrelerŞablonda kullanılan dinamik değerlerin tanımları

Parametreler​

Bir şablona bağlı her parametre şunları içerir:

  • Code: Şablon metninde kullanılacak anahtar (örn. SiparisNo).
  • Script: Veritabanında çalıştırılacak SQL ifadesi. Bu sorgu çalışma zamanında değerlendirilir ve dönen değer şablondaki yer tutucunun yerine yazılır.

Inbox Mesajı Nedir?​

Inbox Mesajı (InboxMessage), bir bildirim gönderim talebinin veritabanına yazılmış halidir. Sistemde bir "kuyruk" görevi görür. Anlık gönderim yerine önce veritabanına kaydedilir; ardından arka plan işleyicisi (ProcessInboxMessagesJob) bu mesajları okuyarak gerçek gönderimi gerçekleştirir.

Her InboxMessage şu bilgileri tutar:

AlanAçıklama
TemplateIdKullanılacak mesaj şablonunun kimliği
QueryIdSQL sorgusundan dönen kaydın Id değeri (örn. sipariş ID'si)
ParameterValuesŞablondaki yer tutucuları dolduracak anahtar-değer çiftleri
IsProcessedMesajın başarıyla işlenip işlenmediği
RetryCountKaç kez yeniden deneme yapıldığı
MaxRetriesİzin verilen maksimum yeniden deneme sayısı
ProcessErrorHata durumunda hata detayı

Mesaj Gövdesinin Parametrelerle Doldurulması​

Şablon gövdesi ve konusunda yer tutucu değerler ${ParametreAdi} söz dizimiyle tanımlanır. Örnek:

Sayın ${AdSoyad},

${SiparisNo} numaralı siparişiniz ${SiparisTarihi} tarihinde oluşturulmuştur.
Toplam tutar: ${ToplamTutar} TL

Mesaj gönderimi sırasında sistem ParameterValues sözlüğündeki değerleri kullanarak her ${...} yer tutucusunu karşılık gelen değerle değiştirir.

Örnek ParameterValues:

{
"AdSoyad": "Ahmet Yılmaz",
"SiparisNo": "SP-2024-001",
"SiparisTarihi": "12.06.2026",
"ToplamTutar": "1.250,00"
}

Oluşan mesaj:

Sayın Ahmet Yılmaz,

SP-2024-001 numaralı siparişiniz 12.06.2026 tarihinde oluşturulmuştur.
Toplam tutar: 1.250,00 TL

Önemli: Yer tutucu adları büyük/küçük harf duyarlıdır. ${siparisNo} ile ${SiparisNo} farklı yer tutuculardır.


Zamanlanmış Sorgu (ScheduledInboxQuery) Sistemi​

ScheduledInboxQuery, belirli aralıklarla çalışan ve veritabanından kayıt çekip bunları inbox mesajı olarak kuyruğa ekleyen bir tanımdır.

Tanım Alanları​

AlanAçıklama
AdZamanlanmış sorgunun tanımlayıcı adı
AçıklamaOpsiyonel açıklama metni
SQLÇalıştırılacak SQL sorgusu (mutlaka Id sütunu içermelidir)
ŞablonOluşturulacak inbox mesajlarına bağlanacak mesaj şablonu
Cron İfadesiQuartz formatında çalışma zamanlaması
Maks. Yeniden DenemeBir inbox mesajı için izin verilen maksimum yeniden deneme (varsayılan: 3)
DurumAktif / Pasif

Sistem Nasıl Çalışır?​

┌─────────────────────────────────────────────────────────────────────┐
│ Uygulama Başlangıcı │
│ ScheduledInboxQueryManager → Aktif tanımları yükler │
│ → Her tanım için Quartz Job zamanlar │
└───────────────────────────────┬─────────────────────────────────────┘
│ Cron tetikler
▼
┌─────────────────────────────────────────────────────────────────────┐
│ PopulateInboxMessagesJob │
│ 1. ScheduledInboxQuery tanımını yükler │
│ 2. Tanımdaki SQL'i çalıştırır │
│ 3. Her satır için InboxMessage oluşturur ve veritabanına ekler │
└───────────────────────────────┬─────────────────────────────────────┘
│ ProcessInboxMessagesJob (ayrı job)
▼
┌─────────────────────────────────────────────────────────────────────┐
│ ProcessInboxMessagesJob │
│ 1. İşlenmemiş ve yeniden deneme hakkı olan mesajları çeker │
│ 2. Her mesaj için şablonu yükler │
│ 3. NotificationDispatchService ile e-posta gönderir │
│ 4. Mesajı işlenmiş olarak işaretler ya da hata kaydeder │
└─────────────────────────────────────────────────────────────────────┘

SQL Sorgusunu Yazmak​

ScheduledInboxQuery tanımında girilen SQL sorgusu, gönderilecek mesajları belirler. Sorgu yazarken dikkat edilmesi gereken kurallar:

Zorunlu Kural: Id Sütunu​

SQL sorgusu mutlaka Id adında bir sütun döndürmelidir. Bu sütun, hangi kaydın işlendiğini takip etmek için kullanılır (örn. sipariş ID, fatura ID). Id sütunu olmayan sorgular kayıt sırasında reddedilir.

Ek Sütunlar = Parametre Değerleri​

Id dışındaki tüm sütunlar otomatik olarak o inbox mesajının ParameterValues sözlüğüne eklenir. Sütun adı parametre anahtarı, sütun değeri ise parametre değeri olur.

Örnek​

Gecikmiş siparişleri bildiren bir şablon için:

SELECT
s.Id,
m.AdSoyad,
s.SiparisNo,
CAST(s.OlusturmaTarihi AS VARCHAR) AS SiparisTarihi,
CAST(s.ToplamTutar AS VARCHAR) AS ToplamTutar
FROM Siparisler s
JOIN Musteriler m ON m.Id = s.MusteriId
WHERE s.Durum = 'Beklemede'
AND s.OlusturmaTarihi < NOW() - INTERVAL '2 days'
AND s.BildirimGonderildi = FALSE

Bu sorgu çalıştığında sistem şuna benzer ParameterValues oluşturur:

{
"AdSoyad": "Ahmet Yılmaz",
"SiparisNo": "SP-2024-001",
"SiparisTarihi": "2026-06-10 08:30:00",
"ToplamTutar": "1250.00"
}

Ve bu değerler bağlı şablondaki ${AdSoyad}, ${SiparisNo}, ${SiparisTarihi}, ${ToplamTutar} yer tutucularını doldurur.

Cron İfadesi​

Sistem Quartz formatında cron ifadesi kullanır. Bu format standart Unix cron'dan farklı olarak saniye alanı içerir (7 alan).

ÖrnekAçıklama
0 0 8 * * ?Her gün sabah 08:00'de
0 0/30 * * * ?Her 30 dakikada bir
0 0 9 ? * MON-FRIHafta içi her gün saat 09:00'da
0 0 8 1 * ?Her ayın 1'inde saat 08:00'de

Cron ifadesi kaydedilmeden önce sistem tarafından doğrulanır. Geçersiz bir ifade girildiğinde kayıt reddedilir.


Aktivasyon ve Deaktivasyon​

Yeni oluşturulan zamanlanmış sorgular pasif durumda başlar. Çalışmaya başlaması için arayüzden ya da API üzerinden aktifleştirilmesi gerekir.

Aktifleştirme​

  • Zamanlanmış sorgu, IsActive = true olarak güncellenir.
  • Quartz içinde ilgili job otomatik olarak zamanlanır.
  • Uygulama yeniden başlatıldığında tüm aktif tanımlar otomatik olarak geri yüklenir.

Pasifleştirme​

  • Zamanlanmış sorgu, IsActive = false olarak güncellenir.
  • Quartz içindeki job silinir; bir sonraki tetiklenme iptal edilmiş olur.
  • Halihazırda kuyruğa eklenmiş inbox mesajları etkilenmez, işlenmeye devam eder.

İşlem Akışı Özeti​

Tanım Oluştur
│
▼
Aktifleştir ──► Quartz Job Zamanlanır
│
│ (Cron ifadesine göre)
▼
PopulateInboxMessagesJob çalışır
│
│ SQL sorgusu çalıştırılır
│ Her satır → InboxMessage
▼
Veritabanı (InboxMessages tablosu)
│
│ (ProcessInboxMessagesJob - ayrı çizelge)
▼
Şablon + ParameterValues birleştirilir
E-posta gönderilir
MessagingTransaction kaydedilir

Sık Karşılaşılan Hatalar​

HataOlası NedenÇözüm
SQL sorgusu geçersiz veya 'Id' sütunu içermiyorSQL'de Id sütunu yok veya söz dizimi hatalıSorgunun döndürdüğü sütunlardan birinin adının Id olduğundan emin olun
Template X not foundBağlı şablon silinmişTanımı güncelleyerek geçerli bir şablon seçin
Provider or mail configuration not foundŞablonun sağlayıcısı yapılandırılmamışŞablona bağlı e-posta sağlayıcısını kontrol edin
Mesaj tekrar tekrar gönderiliyorSQL sorgusunda filtre koşulu yokSorgunun zaten işlenmiş kayıtları döndürmemesi için uygun filtre ekleyin
Mesaj MaxRetries aşıldıktan sonra durduKalıcı bir gönderim hatası varProcessError alanındaki hata detayını inceleyip problemi giderin