in

DotNetSide

Dot Net South Italy Developers User Group

Articoli

Articoli pubblicati dagli iscritti a .netSide

Tutorial su Notification services - Ultima Parte

articolo di Giuseppe Di Cillo

Procedura

In questa ultima parte del tutorial utilizzeremo l'esempio presente nella cartella contenuta nel file zip estratta sul vostro disco. Nella cartella troverete una solution di Sql Server che contiene tutti i files del tutorial. Nella mia prova ho scompattato la cartella EsempioNS direttamente in “c:”, ma se volete potete metterla altrove. Se usata un percorso diverso da “c:” dovrete modificare di conseguenza il valore della variabile _PercorsoIstanza_ nel file ICF. Altra cosa che potreste voler cambiare, è l’impostazione SmtpServer nell’elemento DeliveryChannel del file ICF.
Una volta scompattato il file ZIP, possiamo aprire il Management Studio, facciamo Click col tasto destro sulla cartella NotificationServices, e selezioniamo il comando “New Notification Services Instance….”.

Dalla finestra che appare, tramite il pulsante Browse cerchiamo il file EsempioICF.XML nella cartella EsempioNS. Apparirà la seguente finestra:

Vi ricordano niente questi nomi? Sono i ParameterDefaults che abbiamo specificato all’inizio del file ICF. Volendo, qui possiamo modificare i valori di tali parametri. Lasciamo tutto così com’è e diamo l’OK. Verranno così creati, oltre a tutti i componenti di Notification Services, due databases. Il primo è quello dell’istanza e si chiamerà “NomeIstanzaNSMain”, ovvero nel nostro esempio “EsempioNSNSMain”. L’altro è il database dell’applicazione di notifica e si chiamerà “NomeIstanzaNomeApplicazione”, ovvero nel nostro esempio “EsempioNSAvvisoMagazzino”.

Come si vede dalla figura, adesso troviamo nella “cartella” di Notification Services la nostra istanza. Ma tale istanza non è ancora pronta per essere utilizzata. Infatti dovremo prima registrare il servizio windows corrispondente e abilitare i componenti. Per fare questo, clicchiamo col tasto destro sulla nostra istanza EsempioNS e, nel sottomenù Tasks, selezioniamo Register

Apparirà la seguente finestra:

Selezioniamo il check “Create Windows service” e specifichiamo l’account Windows attraverso il cui contesto di sicurezza, opererà il servizio. Dovremmo crearci un account con le minime autorizzazioni necessarie a Notification Services per lavorare. Per esempio, se avessimo creato un distributore di notifiche, che andava a salvare files in una cartella, avremmo dovuto dare le permissions di scrittura sulla cartella all’account da associare al servizio. Inoltre dobbiamo assicurarci che, l’account utilizzato, possa accedere ai databases di istanza e di applicazione. Dato che questo è solo una prima prova, per semplicità, ho utilizzato l’account administrator.
Dando l’ok viene effettivamente creato un servizio windows chiamato NS$NomeIstanza, ovvero, nel nostro esempio NS$EsempioNS.

Fatto questo, dovremo abilitare i componenti della nostra istanza, tramite il comando Enable presente nel solito menu contestuale dell’istanza.

E, infine, sempre nello stesso menu contestuale selezioniamo Start, per far partire effettivamente il servizio.
Finalmente la nostra istanza, e la nostra applicazione di notifica, sono pronte a svolgere la loro funzione.

Ora immaginate che nella vostra applicazione di e-commerce si desideri dare la possibilità agli utenti di registrarsi in modo da poter ricevere delle notifiche. Per fare questo dovremo utilizzare le SQL-NS Subscription Management API che sono delle classi .NET per la gestione delle sottoscrizioni. In uno scenario reale dovremmo scrivere una serie di istruzioni C# (o VB, o qualsiasi linguaggio .NET) nella nostra applicazione di e-commerce, ma per non complicare il tutorial aggiungendovi anche un’intera applicazione Web, ho preferito usare dei files VBScript editabili con il notepad, che utilizzano il Wrapper COM delle API .NET, e che possono essere lanciati nel nostro sistema operativo, semplicemente facendo doppio click su di essi. Per chi volesse studiare le API di gestione delle sottoscrizioni, troverete a questo indirizzo http://msdn2.microsoft.com/it-it/library/ms166433.aspx tutta la documentazione ufficiale.

Aggiunta dei Subscribers

Il primo script che esaminiamo è AggiungiSubscribers.vbs.

Dim nsInstance, nsSubscriber, nsSubscriberDevice

 

Set nsInstance = WScript.CreateObject("Microsoft.SqlServer.NotificationServices.NSInstance")

nsInstance.Initialize "EsempioNS"

 

Set nsSubscriber = WScript.CreateObject("Microsoft.SqlServer.NotificationServices.Subscriber")

nsSubscriber.Initialize (nsInstance)

 

nsSubscriber.SubscriberId = "giuseppe"

nsSubscriber.Add

 

nsSubscriber.SubscriberId = "laura"

nsSubscriber.Add

 

nsSubscriber.SubscriberId = "tiziana"

nsSubscriber.Add

 

Set nsSubscriberDevice = WScript.CreateObject("Microsoft.SqlServer.NotificationServices.SubscriberDevice")

nsSubscriberDevice.Initialize (nsInstance)

 

nsSubscriberDevice.DeviceName = "myDevice"

 

nsSubscriberDevice.SubscriberId = "giuseppe"

nsSubscriberDevice.DeviceTypeName = "SMTP"

nsSubscriberDevice.DeviceAddress = "administrator@adventure-works.com"

nsSubscriberDevice.DeliveryChannelName = "EmailChannel"

nsSubscriberDevice.Add

 

nsSubscriberDevice.SubscriberId = "laura"

nsSubscriberDevice.DeviceTypeName = "SMTP"

nsSubscriberDevice.DeviceAddress = "laura@office.it"

nsSubscriberDevice.DeliveryChannelName = "EmailChannel"

nsSubscriberDevice.Add

 

nsSubscriberDevice.SubscriberId = "tiziana"

nsSubscriberDevice.DeviceTypeName = "SMTP"

nsSubscriberDevice.DeviceAddress = "tiziana@asp.com"

nsSubscriberDevice.DeliveryChannelName = "EmailChannel"

nsSubscriberDevice.Add

 

wscript.echo "Subscribers creati."

 

 

In questo script vengono utilizzate 3 classi: NSInstance, Subscriber e SubscriberDevice.
NsInstance rappresenta, naturalmente, l’istanza di Notification Services, e ci serve sostanzialmente come una sorta di Connection a tale istanza.
Subscriber qui è utile per aggiungere alla nostra istanza 3 subscribers. L’unico dato che specifichiamo è il SubscriberID.
SubscriberDevice serve invece per creare un dispositivo di notifica per ogni subscriber precedentemente aggiunto. In questo caso indicheremo il subscriberId al quale è legato il device, il tipo di device (nel nostro esempio SMTP), l’indirizzo del Device (l’indirizzo email nel nostro caso), e il DeliveryChannel che utilizza (nel nostro esempio EmailChannel, che è quello che abbiamo definito nell’ultima sezione del file ICF, ricordate?). Naturalmente per poter testare questa applicazione di prova, dovrete cambiare gli indirizzi in modo da usarne alcuni in vostro possesso.
I subscribers, e i relativi Devices, verranno aggiunti a livello di istanza, e non a livello di applicazione di notifica, in quanto possiamo utilizzare gli stessi identici subscribers, per più applicazioni di notifica.
Da Esplora Risorse, facendo doppio click su questo file, aggiungiamo i subscribers alla nostra istanza.

Aggiunta delle Subscriptions


Il secondo script che andiamo ad esaminare è AggiungiSottoscizioni.vbs.

Dim nsInstance, nsApplication, nsSubscription

 

Set nsInstance = WScript.CreateObject("Microsoft.SqlServer.NotificationServices.NSInstance")

nsInstance.Initialize "EsempioNS"

 

Set nsApplication = WScript.CreateObject("Microsoft.SqlServer.NotificationServices.NSApplication")

nsApplication.Initialize (nsInstance), "AvvisoMagazzino"

 

Set nsSubscription = WScript.CreateObject("Microsoft.SqlServer.NotificationServices.Subscription")

nsSubscription.Initialize (nsApplication), "SottoscrizioneGiacenza"

 

nsSubscription.SetFieldValue "DeviceName", "myDevice"

nsSubscription.SetFieldValue "SubscriberLocale", "it-IT"

 

nsSubscription.SubscriberId = "giuseppe"

nsSubscription.SetFieldValue "ProductId", "1"

nsSubscription.SetFieldValue "QtyThreshold", "10"

nsSubscription.Add

 

nsSubscription.SubscriberId = "laura"

nsSubscription.SetFieldValue "ProductId", "3"

nsSubscription.SetFieldValue "QtyThreshold", "1"

nsSubscription.Add

 

nsSubscription.SubscriberId = "tiziana"

nsSubscription.SetFieldValue "ProductId", "2"

nsSubscription.SetFieldValue "QtyThreshold", "30"

nsSubscription.Add

 

wscript.echo "Subscriptions create."

 

Anche qui viene utilizzata la classe NSInstance per creare la connessione all’istanza.
Inoltre vengono usate le classi NSApplication e NSSubscription.
NSApplication viene usata per “collegarsi” alla nostra applicazione di notifica (nell’esempio è “AvvisoMagazzino”).
NSSubscription viene utilizzata per creare 3 Subscriptions (una per ogni subscriber creato con lo script precedente), basate sulla struttura specificata nel file ADF. Infatti nell’inizializzazione dell’oggetto, troverete un riferimento a "SottoscrizioneGiacenza", che guardacaso è esattamente il nome che abbiamo dato allo schema della SubscriptionClass nel file AvvisoMagazzinoADF.xml, che abbiamo descritto precedentemente. Per ogni Subscription specifichiamo la proprietà SubscriberID, e, tramite il metodo SetFieldValue, il nome del Device da utilizzare, la localizzazione, il ProductID, e la soglia di innesco dell’avviso.
Anche in questo caso, facendo doppio click da Esplora Risorse su questo file, eseguiamo lo script, creando così le nostre Subscriptions.

Adesso abbiamo davvero tutto: un’istanza di Notification Services, un’applicazione di notifica configurata, dei Subscribers con i loro dispositivi di notifica, e delle Subscriptions.
L’unica cosa che adesso ci serve, per vedere se tutto sta funzionando, è un Evento.

 

Passare gli eventi all’applicazione di notifica

Per poter innescare le notifiche è necessario che il provider di eventi che abbiamo definito nel file ICF generi effettivamente gli eventi. Il provider definito da noi, è un provider Non Hosted, ovvero dovremo essere noi sviluippatori a lanciare l’evento tramite l’esecuzione di alcune Stored Procedures presenti nel database dell’applicazione di notifica.
Il file “GeneraEventi.sql” contiene tali istruzioni.

USE EsempioNSAvvisoMagazzino;

 

DECLARE @BatchID bigint;

EXEC dbo.NSEventBeginBatchGiacenzaModificata N'GenerazioneEventiTSQL', @BatchID OUTPUT;

 

 

EXEC dbo.NSEventWriteGiacenzaModificata

       @EventBatchId=@BatchID,

       @ProductId=1,

       @ProductName='Zuccotto',

       @UnitsInStock = 50

 

EXEC dbo.NSEventWriteGiacenzaModificata

       @EventBatchId=@BatchID,

       @ProductId=2,

       @ProductName='Muffins',

       @UnitsInStock = 2

 

EXEC dbo.NSEventWriteGiacenzaModificata

       @EventBatchId=@BatchID,

       @ProductId=3,

       @ProductName='Crostata',

       @UnitsInStock = 5

 

 

EXEC dbo.NSEventFlushBatchGiacenzaModificata @BatchID

 

Come potete vedere nello script, è necessario creare un cosidetto Batch di eventi tramite la stored procedure “NSEventBeginBatchGiacenzaModificata” (naturalmente la parte finale del nome cambia a seconda di come abbiamo chiamato la classe dell’evento, nel file ADF), che richiede come parametri il nome del provider Non Hosted che abbiamo definito nel file ICF (nel nostro caso “GenerazioneEventiTSQL”), e un parametro di output da utilizzare come puntatore al Batch.
Creato il batch, aggiungiamo ad esso tre eventi, tramite l’esecuzione della stored procedure “NSEventWriteGiacenzaModificata”, la quale richiede come parametri, i valori da inserire nella tabella degli eventi (nel nostro caso ProductId, ProductName, e UnitsInStock). Infine, tramite la stored procedure “NSEventFlushBatchGiacenzaModificata”, il batch viene finalmente processato.
A questo punto, se il server SMTP specificato nel DeliveryChannel è raggiungibile e funzionante, e se gli indirizzi email specificati per i subscribers sono giusti, dovreste ricevere, nella cassetta della posta elettronica, un email tipo quella rappresentata nella figura seguente.

 

 

Conclusione

Ho volutamente semplificato molti aspetti di Notification Services. Ma credo che questo tutorial possa darvi almeno l’idea dei vantaggi del suo utilizzo.
Realizzare da zero una piattaforma di notifica implicherebbe:

 

  • creare tutte le tabelle, views, stored procedures, triggers di nostra mano
  • tenere traccia di quali eventi sono stati completamente processati e quali no
  • realizzare una serie di reports per controllare l’andamento dell’applicazione
  • effettuare un testing approfondito
  • implementare un sistema di localizzazione dei messaggi
  • implementare un sistema di security
  • prevedere la scalabilità del sistema


    Tutto ciò è già pronto per noi in Notification Services, e a noi non resta che utilizzarlo tramite questo mix di xml, t-sql, e .NET (o COM).
    Certo per il momento non esiste un wizard o un pannello grafico per facilitarne l’utilizzo, ma, visti i vantaggi, vale la pena di approfondirne lo studio.
    Buon lavoro.

Only published comments... Mar 26 2007, 05:52 PM by DotNetSide Staff
Filed under:
Attachment: EsempioNS.zip

Comments

 

Blog di Giuseppe Di Cillo said:

Finalmente online, l'ultima parte del tutorial di Notification Services. Dopo la definizione dei

March 27, 2007 10:57 PM
Powered by Community Server (Commercial Edition), by Telligent Systems