Makale Özeti

Notification servisleri SQL SERVER 2005’te yer alan özelliklerden biridir. İsminden de anlaşıldığı üzere, bu servisler kendilerine bildiri gönderilmesi istenen nesnelere bildiri gönderen servislerdir

Makale

SQL SERVER 2005 NOTIFICATION SERVICES

 

         Notification servisleri SQL SERVER  2005’te yer alan özelliklerden biridir. İsminden de anlaşıldığı üzere, bu servisler kendilerine bildiri gönderilmesi istenen nesnelere bildiri gönderen servislerdir. Bu servislerin SQL SERVER  2005’ e katılmasıyla pek çok avantajı da yanında getirmektedir ki bildirilen tümü veri değişikliklerine dayanmaktadır. SQL SERVER 2005 ile bu servislerin birlikte olması uygulamaların performansını düşürmeden daha uygun hale getirmektedir. Terimsel olarak ise, bu servisler bilinen bir veride herhangi bir değişim gözlenmesini, herhangi bir nesnenin ya da varlığın(entity) olay meydana geldiğinde bildirilme istenip istenmediğini, istendiği takdirde bildiri gönderilmesini kontrol eden servislerdir. Buradan bakıldığında basit gibi görünüyor çünkü bu Notification Servisleri durumu o kadar esnek bir hale getiriyor ki artık havuz olayları(polling events), zamanlama(scheulding),  biçimlendirme(formatting), bildirilerin taşınması gibi uygulamaların yapılmasında hiçbir problem yaşamayacaksınız. Nedeni ise bunların Notification Servisleri  ile  birlikte kolay, entegre ve geliştirme ortamı için hazır halde gelmesidir.

         Örneğin, ben bir firmanın stok fiyatları yükseldiğinde ya da önceden belirtilen bir noktanın altına geldiğinde E-mail/SMS ile bilgilendirilmek isterim. Diğer bir örnek ise uçuşumun iptal olduğunda veya zamanlar değiştiğinde telefonumun farklı bir tonla çalmasını isterim. Bunun gibi yüzlerce durum oluşturulabilir. İşte bu da Notification Servisler’in ortaya çıktığı an olur.

 

Mimari

 

Mimariyi anlamak için önce aşağıdaki terimleri bilmek gerekir :

 

Olay (Event) : Belirlenen bir veriyi etkileyen bir harekettir.

Başvuran (Subscriper) : Bir olay olduğunda bildirilmek istenen varlık ya da başlıktır.

Başvurma (Subscription) : Başvuran tarafından kararlaştırılmış olup ne zaman ve hangi şekilde bildirinin gerçekleşmesidir.

Bildirme (Notification) : Bildiri E-mail gibi iletişim kanalları olarak adlandırılabilir.

 

Notification Servisleri 4 ana yapım aşamasında oluşur.

1 – Başvurma(Subscription)

2 – Olaylar (Events)

3 – Üretici(Generator)

4 – Ulaştırma ve dağıtım(Delivery)

 

Başvurma verisi (Subscription data), (SMO) Subscription Management Objects kullanılarak Notification Servis uygulamasına dahil edilebilir. Olay sağlayıcı ların(Event Provider) yardımıyla olaylar olay tablosunda işlenebilir. Olaylar olay tablosunda işlenildiğinde, üretici (generator) uyanır ( generator zaman ayarlı ya da olay ayarlı olabilir buradaki durumda olay ayarlıdır) ve kuralları uygulamaya başlar. Kurallar başvuranla ilişkilidir yani birliktedir ve bu üretici(generator) herhangi bir olayın bunlara uyup uymadığını kontrol eder. Herhangi bir şey bulunursa, üretici(generator) bildiri oluşturmaya başlar ve bildiri tablolarını doldurur. Bildiriler bildiri tablosuna ulaştığında, dağıtıcı(distrubitor) uyanır ve her biri bildiriyi işler, biçimlendirir sonra özel kanalları kullanarak gönderir.

 

Başvurma Verisi(Subscription data) Ekleme

 

Yukarıda da açıklandığı gibi Subscription, başvuranın hangi tipli olayla ilgilendiği belirten kurallar bütünüdür. Notification Servisleri başvuranı ve başvurma verisi eklemek için bir takım yönetilen API kullanır.

 

Subscription Management uygulaması Notification Servise ulaşmak isteyen herhangi bir ASP.NET ya da Windows uygulaması olabilir. Başvuran id si  genelde karakter olmakla birlikte alet bilgisinin ne tür bir alete taşıma yapıldığı(pc veya cep) ve adres bilgisi(telefon numarası) içerdiği benzersiz bir id dir. Başvurma verisi Notification Servise uygulamasının tipine göre değişiklik gösterir. Bir stok u bildiren uygulama için başvurma verisi firmanın sembolünü içerebilir. Microsoft.SqlServer.NotificationServices isim uzayı bu bilgiyi eklemek için gerekli nesneleri kapsar.

 

Bir Notification Servis uygulmasını ayarlarken, geliştirici configuration dosyasındaki( adp olarak bilinir) subscription tablosunun şemasını bildirmek ihtiyacı duyar. Şemanın yanı sıra, olay kuralları belirlenir. Bu olay kuralları Notification tablolarını kullanan  SQL cümleciklerinden ve saklı prosedürlerden ibarettir. Genellikle, bu kurallar subscription ve olay tablolarını birleştirerek oluşturulan insert ifadeleridir. Her bir olay başvurmanın olay tablosuna bağlı olduğuna işaret eden olay sınıfına bağlanmalıdır.

 

Olayları Toplama

 

Olay toplanır ve Olay Sağlayıcılar kullanılarak olay tablosuna aktarılır. Notification Servisleri, FileSystemWatcher,Sql Server ve Analiz Servislerini standart sağlayıcılar olarak sağlar. Geliştiriciler bunların dışında kendi sağlayıcılarını yazabilirler. Notification Servis uygulaması oluşturulmadan önce olay tablosunun yapısı ADP dosyasında belirtilmelidir. Sağlayıcılar ADF dosyasında Providers Tagi altında belirtilmelidir. FileSystemWatcher windows altında herhangi bir klasöre ve dosya tipini gözetlemeye başlar. Olay verisi hazır hale geldiğinde ise, dosyayı işler ve olay tablosuna işler.

 

Bildiri Ayarı

 

Generator, olay verisi üzerindeki başvurmaları değerlendirir ve Notification tablosu içinde bildirileri oluşturur. Notification tablosunun şeması ADF dosyası içinde Notification Tag’ı altında belirtilmelidir. Her bir bildiri sınıfı birkaç içerik biçimleyicisine eklenebilir. İçerik biçimlendiricisi dağıtıcının sonuçtaki bildiriyi biçimlendirmeye çalıştığında kullanılır. ( örneğin, içerik biçimleyicisi XSLT dosyası olabilir.) Son olarak bildiri en az bir tane ulaştırma protokolüne(file,smtp) eklenir.

 

ADF

 

ADF Notification Servis uygulamasına dahil olan ana giriştir. Bu dosya Notification Servis uygulamasını oluşturmak için gereken içeriğin tümünü kapsar. Notification Servis’in yapısı Notification Servis örneğini, Notification Servis örneği ise bir ya da birden fazla Notification Servis uygulamasını içerir. NSControl satır komut aracı olup Notification servis ve uygulamaları oluşturmak, güncellemek ve değiştirmek için kullanılır. Eğer SQL Server 2005 Beta yı kullanıyorsanız SQL Server Management Studio u Notification Servis örneklerini oluşturmak için kullanabilirsiniz.

 

Big Shot Örneği

 

Uygulama insanların boş vakitleriyle ilgilidir. İnsanların ne zaman boş olduklarına dair başkasına bir bildiri göndermekle yükümlüdür.

Olay tablosu ad, lakap, hareket ve tanımlamaları içermelidir. Hareket, hareket tipini ve tanımlama ise hareketi gösterir.

 

<EventClasses>
         < EventClass >
                   <EventClassName>BigShotEvents</EventClassName>
                  < Schema >
                            < Field >
                                      <FieldName>Name</FieldName>
                                      <FieldType>nvarchar(30)</FieldType>
                            </ Field >
                            < Field >
                                      <FieldName>NickName</FieldName>
                                      <FieldType>nvarchar(6)</FieldType>
                            </ Field >
                            < Field >
                                      <FieldName>Action</FieldName>
                                      <FieldType>nvarchar(255)</FieldType>
                            </ Field >
                            < Field >
                                      <FieldName>Description</FieldName>
                                      <FieldType>nvarchar(3500)</FieldType>
                            </ Field >
                   </ Schema >
                   < IndexSqlSchema >
                     <SqlStatement>CREATE INDEX BigShotEventsIndex ON BigShotEvents ( NickName )</SqlStatement>
                   </ IndexSqlSchema >
        </EventClass>
</EventClasses>

 

Yukarıda Notification Servis örneği oluşturulduğunda NSBigShotEventsEvents tablosu veritabanın da oluşturulur. Olay sağlayıcı tabloya girenlerden biridir. Daha sonraki kısım ADF nin sağlayıcı konfigürasyon nunu anlatır.

 

Sağlayıcılar

 

Bu bölüm bizim uygulamamız için 2 tane olay sağlayıcısı oluşturur. Birisi, belirtilen klasörü gözetleyen FileSystemWatcher. %_NSSystem_% app.config dosyasında belirtilen bir parametredir. Diğer sağlayıcı ise, olay verilerini yakalamak için kullandığımı SQL SERVER cümlecikleri için SQL sağlayıcısıdır. FileSystemWatcher olay tabanlı iken, SQL SERVER zamana bağlı çalışmaktadır. Eğer scheulde tagı nın altına bakarsanız her 15 saniyede bir generator select ifadesini çalıştırdığını ve olay tablosunu dönen değerle doldurduğunu görürsünüz. Where ifadesi olmayan bu tip bir Select ifadesinde her zaman aynı sonuç çıkacağından bu tip bir ifadenin kullanılması kaçınılmalıdır.

 

 

<Providers>
         < HostedProvider >
                   <ProviderName>FlightEP</ProviderName>
                   <ClassName>FileSystemWatcherProvider</ClassName>
                   <SystemName>%_NSSystem_%</SystemName>
                   < Arguments > 
                            < Argument > 
                                      <Name>WatchDirectory</Name>
                                      <Value>%_EventsDir_%</Value>
                            </ Argument > 
                            < Argument > 
                                      <Name>SchemaFile</Name>
                        <Value>%_BaseDirectoryPath_%\AppDefinition \EventsSchema.xsd</Value>
                            </ Argument > 
                            < Argument > 
                                      <Name>EventClassName</Name>
                                      <Value>BigShotEvents</Value>
                            </ Argument > 
                   </ Arguments > 
         </ HostedProvider > 
         < HostedProvider > 
                   <ProviderName>BigShotSQL</ProviderName>
                   <ClassName>SQLProvider</ClassName>
                   <SystemName>%_NSSystem_%</SystemName>
                   < Schedule > 
                            <Interval>P0DT00H00M15S</Interval>
                   </ Schedule > 
                   < Arguments > 
                            < Argument > 
                                      <Name>EventsQuery</Name>
                       <Value>Select Name, NickName, Action, Description From BigShotActions</Value>
                            </ Argument > 
                            < Argument > 
                                      <Name>EventClassName</Name>
                                      <Value>BigShotEvents</Value>
                            </ Argument > 
                   </ Arguments > 
         </ HostedProvider >
</Providers>

 

Başvurma

 

Uygulamamız big shot lakabına ve hareketine bağlı olaylar için başvuranların dolmasına izin vermektedir. ADF dosyası başvurma bölümü aşağıdaki şekli alır:

<SubscriptionClasses>
         < SubscriptionClass >
         <SubscriptionClassName>BigShotSubscriptions</SubscriptionClassNam
         < Schema >
                   < Field >
                            <FieldName>DeviceName</FieldName>
                            <FieldType>nvarchar(255)</FieldType>
                   </ Field >
                   < Field >
                            <FieldName>SubscriberLocale</FieldName>
                            <FieldType>nvarchar(10)</FieldType>
                   </ Field >
                   < Field >
                            <FieldName>NickName</FieldName>
                            <FieldType>nvarchar(6)</FieldType>
                   </ Field >
                   < Field >
                            <FieldName>Action</FieldName>
                            <FieldType>nvarchar(255)</FieldType>
                   </ Field >
                   </ Schema >
         < IndexSqlSchema >
            <SqlStatement>CREATE INDEX BigShotSubscriptionsIndex ON BigShotSubscriptions ( NickName, Action )</SqlStatement>
         </ IndexSqlSchema >
         < EventRules >
                   < EventRule >
                            <RuleName>BigShotSubscriptionsEventRule</RuleName>
                            < Action >
                                      INSERT INTO BigShotNotifications(
                          SubscriberId,
                         DeviceName,
                           SubscriberLocale,
                                      Name, 
                                      NickName,
                                     Action,
                                      Description
                                      )
                        SELECT
                          S.SubscriberId,
                          S.DeviceName,
                          S.SubscriberLocale,
                          E.Name,
                          E.NickName,
                          E.Action,
                          E.Description
                        FROM
                          BigShotEvents E, BigShotSubscriptions S
                                      WHERE
                            E.NickName = S.NickName
                                      AND
                            (E.Action = S.Action or S.Action IS Null)
                            </ Action >
                            <EventClassName>BigShotEvents</EventClassName>
                   </ EventRule >
         </ EventRules >
    </SubscriptionClass>
</SubscriptionClasses>

 

Yukarıda NSBigShotSubscriptionsSubscriptions tablosunun hangi sütunları  kapsadığı gösterilmektedir. Genel uygulama alet ismini, başvuranların bölgesi( dil desteği açısından ) ve diğer uygulama özel sütunlarını içine almak. Ayrıca bu tablolarda indexler oluşturabilirsiniz. EventsRules düğümü Başvurma ve Olay tabloları arasındaki bağlantıya dayanan Notification tablosuna eklemeler(insert) yapılmasını sağlar.

 

Notifications Ulaştırma ve dağıtım

 

ADF dosyamızdaki Notification bölümü bildirililerin ne tip bir biçimlendirme kullanılacağı ve nasıl ulaştırılacağını açıklar.  Örnekte dosya ve smtp ulaştırma yöntemi ve XSLT biçimlendirme yöntemi kullanılmaktadır. Bunun ayarı yapılmıştır. Notification Servisleri belirlenen şema ile NSBigShotNotificationsNotifications adlı tabloyu oluşturur.

 

<NotificationClasses>
<NotificationClass>
    <NotificationClassName>BigShotNotifications</NotificationClassName>
         < Schema >
                   < Fields >
                            < Field >
                                      <FieldName>Name</FieldName>
                                      <FieldType>nvarchar(30)</FieldType>
                            </ Field >
                            < Field >
                                      <FieldName>NickName</FieldName>
                                      <FieldType>nvarchar(6)</FieldType>
                            </ Field >
                            < Field >
                                      <FieldName>Action</FieldName>
                                      <FieldType>nvarchar(255)</FieldType>
                            </ Field >
                            < Field >
                                      <FieldName>Description</FieldName>
                                      <FieldType>nvarchar(3500)</FieldType>
                            </ Field >
                   </ Fields >
         </ Schema >
         < ContentFormatter >
                   <ClassName>XsltFormatter</ClassName>
                   < Arguments >
                            < Argument >
                                      <Name>XsltBaseDirectoryPath</Name>
                             <Value>%_BaseDirectoryPath_%\AppDefinition</Value>
                            </ Argument >
                            < Argument >
                                      <Name>XsltFileName</Name>
                                      <Value>NoOp.xslt</Value>
                            </ Argument >
                   </ Arguments >
         </ ContentFormatter >
         <DigestDelivery>true</DigestDelivery>
         < Protocols >
                   < Protocol >
                            <ProtocolName>File</ProtocolName>
                            < Fields >
                                      < Field >
                                               <FieldName>Name</FieldName>
                                               <FieldReference>Name</FieldReference>
                                      </ Field >
                                      < Field >
                                               <FieldName>NickName</FieldName>
                                               <FieldReference>NickName</FieldReference>
                                      </ Field >
                                      < Field >
                                               <FieldName>Action</FieldName>
                                               <FieldReference>Action</FieldReference>
                                      </ Field >
                                      < Field >
                                               <FieldName>Description</FieldName>
                                      <FieldReference>Description</FieldReference>
                                      </ Field >
                            </ Fields >
                   </ Protocol >
</NotificationClass>
</NotificationClasses>

 

Her türlü ek ayar ( klasör yolları ) app.confif de yer almalıdır ki bu da ADF dosyamıza bir referans oluşturulması demektir.

 

Bir sonraki makalemizde görüşmek dileği ile...

iyi günler...

 

 

metin.altuntas@gmail.com

www.caretta.net

CARETTA