فصل پنجم

 

سرويس‌هاي هشداردهي

 

سرويس‌هاي هشداردهي[1] ابتدا در سال 2002 به عنوان يك download وب براي SQL Server 2000 معرفي شدند. در SQL Server 2005، سرويس‌هاي هشداردهي به عنوان زير سيستمي جديد به محصول پايه اضافه شده‌اند. سرويس‌هاي هشداردهي يك چارچوب كاري هستند كه به شما امكان ساخت برنامه‌هاي پيام‌رساني اختصاصي را مي‌دهند كه اين برنامه‌ها قادر به قرار دادن اطلاعات اختصاصي براي چندين مشترك و وسيله هستند. سرويس‌هاي هشداردهي توسط انواعي از شركت‌هاي معروف براي تحويل اطلاعات شخصي به مشتريان آن‌ها استفاده مي‌شوند. براي نمونه، موبايل MSN از سرويس‌هاي هشداردهي براي ارسال اخبار خصوصي و ساير اطلاعات به انواع وسايل موبايل استفاده مي‌كند. پياده‌سازي سرويس‌هاي هشداردهي معروف ديگر در ESPN.com است كه سرويسي را فراهم كرده است كه مشتريان مي‌توانند براي يافتن نتايج مسابقات ورزشي استفاده كنند. سرويس‌هاي هشداردهي SQL Server 2005 به شما اجازه مي‌دهند تا اين انواع برنامه‌هاي شيوه هشداردهي يكسان را بسازيد. در حالي كه مي‌توانيد برنامه‌هاي هشداردهي را از صفر بسازيد، سرويس‌هاي هشداردهي SQL Server 2005 شروعي عالي در اين نوع پروژه را با فراهم كردن يك چارچوب كاري مستحكم، مقياس‌پذير و تست شده به شما مي‌دهند كه مي‌توانيد از آن‌ها به عنوان پايه‌اي براي برنامه‌هاي هشداردهي خود استفاده كنيد.

در اين فصل، مطالبي درباره زيرسيستم سرويس‌هاي هشداردهي جديد مي‌آموزيد. در اولين بخش اين فصل، مروري بر اين زير سيستم جديد خواهيد داشت. سپس، مطالبي درباره نحوه ساخت برنامه‌هاي سرويس‌هاي هشداردهي مي‌آموزيد. براي شروع، مروري بر فرآيند برنامه‌نويسي خواهيد داشت و سپس مقداري كد نمونه را مي‌بينيد كه نحوه استفاده از چارچوب كاري سرويس‌هاي هشداردهي را براي ساخت برنامه‌هاي شيوه هشداردهي تشريح مي‌كنند.

 

مروري بر سرويس‌هاي هشداردهي

يك برنامه سرويس‌هاي هشداردهي يك لايه نرم‌افزاري است كه بين يك منبع اطلاعات و دريافت كننده مورد نظر آن اطلاعات قرار دارد. برنامه سرويس‌هاي هشداردهي رويدادهاي از پيش‌تعريف شده خاص را كنترل كرده و مي‌تواند به‌طور هوشمند اطلاعاتي درباره اين رويدادها را براي انواع وسايل مقصد مختلف با استفاده از يك زمانبند تحويل شخصي فيلتر كرده و مسيريابي مي‌كند. برنامه‌هاي سرويس‌هاي هشداردهي شامل سه جزء اصلي هستند: رويدادها، اشتراك‌ها و هشدارها. شكل 1-5 مروري سطح بالا از يك برنامه سرويس‌هاي هشداردهي را فراهم مي‌كند.

 

شكل 1-5 مروري بر سرويس‌هاي هشداردهي

 

رويدادها

در يك برنامه سرويس‌هاي هشداردهي، رويدادها تنها چيزي هستند كه به نظر مي‌رسند (مواردي اتفاق مي‌افتد كه بايد از آن‌ها مطلع شويد). در مورد مثال ESPN.com، يك رويداد ممكن است چيزي شبيه نتايج نهايي برخي رخدادهاي ورزشي باشد. براي NASDAR، يك رويداد ممكن است افزايش بها به سطح خاصي باشد. در سرويس‌هاي هشداردهي SQL Server 2005، رويدادها به عنوان رديف‌هايي در يك جدول از پايگاه داده Notification Services ذخيره مي‌شوند.

 

اشتراك‌ها

اشتراك‌ها[2] نحوه بيان كاربران يك برنامه Notification Services به سيستم درباره نوع رويدادهايي هستند كه در آن‌جا درج مي‌شوند. مثلاً، در مثال Notification Services مبتني بر ورزش‌، يك كاربر ممكن است اشتراكي را براي داشتن نتايج نهايي بازي‌هاي Los Angeles Lakers ايجاد كند. در مثال Notification Services قيمت‌هاي سهام، يك كاربر ممكن است اشتراكي را براي مطلع شدن ايجاد كند، هنگامي كه قيمت سهام مايكروسافت به بيش از 50 دلار در هر اشتراك برسد. SQL Server 2005 Notification Services اشتراك‌ها را نظير رويدادها به عنوان رديف‌هايي در يك جدول ذخيره مي‌كنند.

 

هشدارها

يك هشدار[3] لزوماً پيامي است كه به كاربر نهايي ارسال خواهد شد و حاوي اطلاعات مربوط به رويدادي است كه كاربر مشترك آن است. براي مثال در سرويس‌هاي هشداردهي ESPN، اين ممكن است يك پيام e-mail باشد كه تيم دلخواه شما بر رقباي خود پيروز شده و اين نتيجه نهايي است. هشدارها مي‌توانند به فرمت‌هاي مختلف براي انواع وسايل مقصد مختلف تحويل شوند.

 

موتور هشداردهي

كار برنامه Notification Services، كنترل رويدادهاي خارجي و يافتن تطابق‌هايي بين رويدادها و اشتراك‌هاي ثبت شده است. هنگامي كه رويدادي با اشتراكي تطابق دارد، موتور Notification Services هشداري را به كاربر نهايي ارسال مي‌كند. مقياس‌پذيري يك برنامه Notification Services وابسته به بخش بزرگي از نحوه تطابق رويدادها با اشتراك‌ها توسط موتور Notification Services است. مايكروسافت چارچوب كاري Notification Services مرتبط را به صورت مقياس‌پذير در سطح اينترنت طراحي كرده است، بدين معني كه با محيطي مناسب، SQL Server 2005 Notification Services مي‌تواند براي مديريت ميليون‌ها رويداد، اشتراك و هشدار رشد كند. براي انجام اين كار، Notification Services از موتور پايگاه داده رابطه‌اي بسيار كارآمد SQL Server 2005 براي الحاق رديف‌هايي از جدول رويدادها با رديف‌هاي جدول اشتراك‌ها براي تطابق رويدادها با اشتراك‌ها بهره ببرند.

 

معماري Notification Services

SQL Server 2005 Notification Services محيطي است كه طراحي شده است تا به شما امكان نوشتن و توزيع برنامه‌هاي هشداردهي با مقياس‌پذيري بالا را مي‌دهد. برنامه‌هاي SQL Server 2005 Notification Services با استفاده از T-SQL و XML ايجاد مي‌شوند و با استفاده از .NET Framework يكپارچه‌اي اجرا مي‌شوند كه در SQL Server 2005 ساخته شده است. نگارش‌هاي 32 و 64 بيتي محيط Notification Services وجود دارند. مي‌توانيد مروري بر معماري SQL Server 2005 Notification Services را در شكل 2-5 ببينيد.

 

شكل 2-5 مروري بر معماري Notification Services

 

در بالاي شكل 2-5، مي‌توانيد برنامه Notification Services را ببينيد. اين برنامه توسط برنامه‌نويس نوشته مي‌شود؛ وظيفه اصلي آن، افزودن اطلاعات اشتراك در جدول Notification Services Subscriptions است. اين برنامه مي‌تواند يك برنامه وب ASP.NET، يك برنامه ويندوزي Win32 استادارد يا هر نوع برنامه‌اي كه قادر به فراخواني APIهاي مديريت شده .NET است (به‌طور مستقيم يا از طريق كلاس‌هاي .NET COM Interop)، باشد.

در سمت چپ شكل 2-5، مي‌توانيد بخش رويدادهاي معماري SQL Server 2005 Notification Services را ببينيد. رويدادها توسط تأمين كنندگان رويداد[4] به سيستم اضافه مي‌شوند. اين تأمين كنندگان رويداد، منابع دستيابي خارجي را براي بررسي تغييرات كنترل مي‌كنند. SQL Server 2005 همراه با دو تأمين كننده رويداد تعبيه شده است: يك ناظر سيستم فايل[5] كه تشخيص تغييرات در فايل‌هاي سيستم عامل را ممكن مي‌سازد و تأمين كننده رويداد SQL Server كه يك پايگاه داده Analysis Services يا SQL Server را براي تغييرات كنترل مي‌كند. Notification Services هم‌چنين مي‌تواند توسعه يابد تا ساير منابع داده خارجي را از طريق كاربرد تأمين كنندگان رويداد اختصاصي بررسي كنيد. هنگامي كه يك تأمين كننده رويداد با تغيير داده‌اي مواجه مي‌شود، آن رويداد را در جدول events پايگاه داده Notification Services ثبت مي‌كند.

مولد (يا موتور) Notification Services كه در وسط شكل 2-5 نشان داده شده است، از منطق فراهم شده توسط برنامه‌نويس Notification Services براي تطبيق رويدادهاي ذخيره شده توسط تأمين كنندگان رويداد براي اشتراك‌هاي وارد شده توسط كاربران نهايي برنامه استفاده مي‌كند. هنگامي كه رويدادي با يك اشتراك تطابق دارد، مولد رديفي حاوي اطلاعات مشترك و رويداد را در جدول notifications پايگاه Notification Services اضافه مي‌كند.

توزيع كننده[6] كه در سمت راست پايين شكل 2-5 نشان داده شده است، جدول notifications را براي ورودي‌هاي جديد كنترل مي‌كند. هنگامي كه مولد، ورودي جديدي را به جدول notifications اضافه مي‌كند، توزيع كننده آن ورودي را بازيابي كرده و آن را براي تحويل فرمت مي‌كند. به‌طور پيش‌فرض، توزيع كننده، هشدار را با استفاده از XSLT فرمت خواهد كرد كه خروجي را به روشي نمايش مي‌دهد كه با وسيله خروجي مشخص شده سازگار است. هنگامي كه هشدار فرمت شده باشد، آن‌گاه توزيع كننده آن را براي تحويل به كاربر نهايي به تأمين كننده توزيع ارسال مي‌كند. SQL Server 2000 همراه با سه تأمين كننده توزيع تعبيه شده است: يك تأمين كننده SMTP، يك تأمين كننده فايل و يك تأمين كننده HTTP كه مي‌تواند براي SOAP، .NET Alerts و هشدارهاي SMS استفاده شود. همان‌گونه كه احتمالاً حدس زده‌ايد، تأمين كننده SMTP، هشدارها را از طريق يك سرور e-mail از قبيل Exchange تحويل مي‌دهد. تأمين كننده فايل، هشدار را به شكل يك فايل سيستم عامل تحويل مي‌دهد. تأمين كننده HTTP هشدار را به عنوان يك صفحه وب HTML يا با استفاده از يكي از پروتكل‌هاي مرتبط با HTTP ديگر تحويل مي‌دهد. علاوه بر اين موارد، هم‌چنين مي‌توانيد قابليت‌هاي تحويل توزيع كننده را با افزودن يك تأمين كننده توزيع اختصاصي توسعه دهيد.

 

نوشتن برنامه‌هاي Notification Services

در اولين بخش اين فصل، مروري بر SQL Server 2005 Notification Services جديد داشتيم. در اين بخش، به بررسي عمقي‌تر خواهيم پرداخت، بنابراين مطالبي درباره مراحل واقعي موجود در نوشتن برنامه‌هاي SQL Server 2005 Notification Services مي‌آموزيد. ابتدا مروري بر فرآيند برنامه‌نويسي خواهيم داشت و سپس يك برنامه Notification Services بسيار ساده را مي‌سازيم.

مراحل برنامه‌نويسي

فرآيند نوشتن برنامه‌هاي Notification Services با تعريف طرح‌واره و قوانيني شروع مي‌شود كه نحوه كار برنامه را مشخص مي‌كنند. سپس، بايد برنامه را كامپايل كنيد. سپس بايد رابطي بسازيد كه به كاربر اجازه افزودن اشتراكاتي را به برنامه مي‌دهند. بالاخره، بايد اجزايي اختصاصي را اضافه كنيد كه شايد توسط برنامه مورد نياز باشند. اجازه دهيد نگاهي به هر يك از اين مراحل به‌طور مفصل داشته باشيم.

 

تعريف طرح‌واره و قوانين

برنامه‌نويس Notification Services از تركيبي از XML و T-SQL براي تعريف قوانين و طرح‌واره برنامه استفاده مي‌كند. هنگامي كه طرح‌واره و قوانيني را براي يك برنامه Notification Services تعريف مي‌كنيد، لزوماً رويدادهايي را كه برنامه كنترل خواهد كرد و اشتراك‌هاي برنامه، هشدارهاي آن و منطقي كه براي تطابق رويدادها با اشتراك‌ها استفاده خواهد شد، توصيف مي‌كند. قوانين و طرح‌واره برنامه Notification Services در اصل در دو فايل تعريف مي‌شوند. Adf.xml و config.xml. مي‌توانيد اين فايل‌ها را با استفاده از يك ويراستار متني استاندارد يا يك ويراستار مبتني بر XML نظير Visual Studio 2005 يا XMLSpy ايجاد كنيد. اطلاعات مفصل‌تر درباره محتويات خاص فايل‌هاي adf.xml و config.xml در ادامه فصل ارايه مي‌شود.

 

كامپايل برنامه

بعد از ايجاد طرح‌واره و قوانين، مرحله بعدي در ساخت يك برنامه Notification Services، كامپايل تمام كد و رجيستر كردن سرويسي است كه برنامه‌هاي Notification Services را اجرا خواهد كرد. براي كامپايل برنامه، SQL Server 2005 برنامه سودمند خط فرمان nscontrol را فراهم كرده است كه براي ايجاد، رجيستر كردن و هم‌چنين بهنگام‌رساني برنامه Notification Services استفاده مي‌شود. علاوه بر اين، SQL Server Management Studio، يك كادر محاوره‌اي را فراهم كرده است كه به شما امكان ايجاد محاوره‌اي برنامه‌هاي Notification Services را مي‌دهد.

 

ساخت برنامه‌هاي مديريتي اشتراك هشدار

دو مرحله اول، موتور اصلي برنامه Notification Services را مي‌سازند. هرچند، كاربران هنوز نياز به روشي براي افزودن اطلاعات اشتراك براي برنامه Notification Services دارند. براي اين كه به كاربران امكان وارد كردن اطلاعات اشتراكشان را بدهيد، برنامه Notification Services نياز به يك رابط مديريت اشتراك دارد كه معمولاً يك برنامه وب يا GUI است كه با استفاده از فناوري‌هاي ASP.NET، VB.NET در الحاق با يك محيط برنامه‌نويسي نظير Visual Studio 2005 ساخته مي‌شود.

 

افزودن اجزاي اختصاصي

بالاخره، آخرين مرحله در ساخت برنامه Notification Services، افزودن اختياري هر جزء اختصاصي است كه ممكن است مورد نياز برنامه باشد. اجزاي اختصاصي شامل هر تأمين كننده رويداد مورد نياز، فرمت‌هاي محتوا يا پروتكل‌هاي تحويل هشداري هستند كه در محصول SQL Server 2005 Notification Services پايه نيستند.

 

برنامه Notification Services نمونه

برنامه Notification Services نمونه كه در بخش بعدي اين فصل ارايه مي‌شود، مقدار يك ستون را در يك جدول SQL Server كنترل مي‌كند. هنگامي كه مقدار آن ستون از آستانه خاصي تجاوز مي‌كند، برنامه Notification Services نمونه، يك هشدار e-mail را به كاربر نهايي ارسال خواهد كرد. اين مثال نگارش ساده‌اي از مثال Stock است كه در برنامه‌هاي نمونه SQL Server 2000 Notification Services وجود داشت. براي اين كه همه موارد كار كنند، اين برنامه با استفاده از تأمين كننده SQL Server 2005 براي بررسي يك جدول در پايگاه داده شروع مي‌كند. يك رويداد بايد ايجاد شده و مقدار ستوني را در آن جدول بررسي كند، كاربر بايد اشتراكي را براي آن رويداد وارد كند و يك قانون بايد اضافه شود تا به SQL Server اجازه دهد تا رويدادها را با اشتراك‌ها تطبيق دهد. هنگامي كه رويدادي با قانون رويدادي تطابق داشته باشد، تأمين كننده توزيع e-mail يك برنامه با فرمت XML را به كاربر نهايي ارسال خواهد كرد. حال كه مروري بر برنامه Notification Services نمونه داشتيد، اجازه دهيد تا ساخت آن را ببينيم.

 

ايجاد فايل‌هاي تعريف و پيكربندي برنامه

برنامه‌هاي Notification Services شامل دو فايل اصلي هستند: يك فايل تعريف برنامه[7] (ADF) و يك فايل پيكربندي برنامه[8] (ACF) كه هر دو فايل XML هستند و بايد برطبق طرح‌واره‌هاي xsd آن‌ها ساخته شوند. طرح‌واره‌هاي XSD براي اطمينان از اين مسأله استفاده مي‌شوند كه هر دو سند مالك عناصر و صفات مورد نياز هستند. فايل ACF نام برنامه Notification Services و نام نمونه آن و مسير دايركتوري برنامه را تعريف مي‌كند. نام نمونه لزوماً نام يك سرويس ويندوز است كه برنامه Notification Services را اجرا مي‌كند.

فايل ADF فايل اصلي براي Notification Services است؛ بخش‌هاي متفاوت ADF، رويداد، اشتراك، قوانين و ساختار هشدار را كه توسط برنامه Notification Services به كار خواهند رفت، توصيف مي‌كنند. براي SQL Server 2000، بايد تمام كدنويسي XML را به‌طور دستي براي ايجاد اين دو فايل انجام دهيد. اين امر هم‌چنين براي بتاهاي اوليه SQL Server 2005 درست است. هرچند، SQL Server 2005 نهايي داراي ابزارهاي گرافيكي خواهد بود كه به شما امكان ايجاد فايل‌هاي ACF و ADF را بدون كدنويسي دستي XML در يك ويراستار متني مي‌دهد.

علاوه بر اين دو فايل اصلي كه ساختار و برنامه Notification Services را تعريف مي‌كنند، يك برنامه Notification Services نياز به يك برنامه مديريت اشتراك دارد كه مسئول افزودن اطلاعات اشتراك براي پايگاه داده برنامه Notification Services است. در حالي كه ADF و ACF در اصل با استفاده از XML و T-SQL ساخته مي‌شوند، برنامه مديريت اشتراك معمولاً با استفاده از يك زبان سطح بالا با يك رابط كاربر گرافيكي ساخته مي‌شود.

 

نكته: ساختار راه‌حل چند پروژه‌اي Visual Studio .NET به شما امكان گروه‌بندي ساده فايل‌هاي تعريف برنامه XML و كد مديريت اشتراك را به عنوان دو پروژه‌اي كه بخشي از يك راه‌حل مشترك هستند، مي‌دهد.

 

اين ليست فايل ACF (config.xml) را نشان مي‌دهد كه در برنامه Notification Services نمونه اين فصل استفاده شد:

<?xml version="1.0" encoding="utf-8"?>
<NotificationServicesInstance xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://www.microsoft.com/MicrosoftNotificationServices
    /ConfigurationFileSchema">
    <InstanceName>NSSampleInstance</InstanceName>
      <SqlServerSystem>tecayukon</SqlServerSystem>
    <Applications>
        <Application>
            <ApplicationName>NSSample</ApplicationName>
            <BaseDirectoryPath>C:\NSSample</BaseDirectoryPath>
                <ApplicationDefinitionFilePath>ADF.xml
                </ApplicationDefinitionFilePath>
        </Application>
    </Applications>
    <DeliveryChannels>
        <DeliveryChannel>
            <DeliveryChannelName>EmailChannel
                </DeliveryChannelName>
                <ProtocolName>SMTP</ProtocolName>
        </DeliveryChannel>
    </DeliveryChannels>
</NotificationServicesInstance>

 

مي‌بينيد كه ACF يك سند نسبتاً ساده است. اين فايل مي‌تواند با استفاده از هر ويراستار متني يا مبتني بر XML ايجاد شود. مهم‌ترين نكات توجه برانگيز تگ‌هاي SqlServerSystem، InstanceName، ApplicationName، BaseDirectoryPath و ApplicationDefinitionFilePath هستند. همان‌گونه كه ممكن است حدس زده باشيد، تگ نام SqlServerSystem حاوي نام سيستمي SQL Serverاي است كه ميزبان پايگاه‌هاي داده Notification Services خواهد بود، تگ InstanceName، نام نمونه‌اي را براي برنامه تعريف مي‌كند و تگ ApplicationName نام برنامه Notification Services را تعريف مي‌كند. BaseDirectoryPath به كامپايلر محل يافتن فايل ADF را مي‌گويد و تگ ApplicationDefinitionFilePath نام سند XML حاوي كد ADF را مهيا مي‌سازد. علاوه بر اين آيتم‌هاي پايه، ACF هم‌چنين از تگ DeliveryChannel براي تعريف نحوه تحويل هشدارها استفاده مي‌كند. در اين مثال، تگ DeliveryChannel از پروتكل SMTP براي تحويل هشدارهاي e-mail استفاده مي‌كند.

 

تعريف طرح‌واره رويداد ADF

تعاريف اصلي كه كنترل مي‌كنند چگونه يك برنامه Notification Services كار مي‌كند، در ADF قرار دارند. اولين كاري كه بايد براي ساخت برنامه نمونه انجام دهيد، ساخت طرح‌واره‌اي براي رويدادهاست. در فايل ADF، عنصر EventClasses حاوي كد XML مورد استفاده براي تعريف رويدادهاي Notification Services است. عنصر EventClasses مي‌تواند حاوي چندين تعريف رويداد باشد. هر تعريف رويداد در يك زيرعنصر EventClass مجزا توصيف مي‌شود. قطعه كد زير از فايل adf.xml مثال، كد XML مورد استفاده براي ايجاد نمونه را تشريح مي‌كند:

 

<?xml version="1.0" encoding="utf-8" ?>
<Application xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://www.microsoft.com/MicrosoftNotificationServices/
  ApplicationDefinitionFileSchema">
    <!-- Describe the Events  -->
    <EventClasses>
        <EventClass>
            <EventClassName>DataEvents</EventClassName>
            <Schema>
                <Field>
                    <FieldName>DataID</FieldName>
                    <FieldType>int</FieldType>
                    <FieldTypeMods>not null</FieldTypeMods>
                </Field>
                <Field>
                    <FieldName>DataValue</FieldName>
                    <FieldType>int</FieldType>
                    <FieldTypeMods>null</FieldTypeMods>
                </Field>
            </Schema>
            <IndexSqlSchema>
                <SqlStatement>CREATE INDEX DataEventsIndex
                   ON DataEvents ( DataID )</SqlStatement>
            </IndexSqlSchema>
            <Chronicles>
                <Chronicle>
                    <ChronicleName>DataEventsTable</ChronicleName>
                    <SqlSchema>
                        <SqlStatement>
                          IF EXISTS(SELECT name FROM dbo.sysobjects
                          WHERE name = 'DataEventsTable')
                          DROP TABLE dbo.DataEventsTable
                          CREATE TABLE DataEventsTable
                          (
                            [DataID]    int,
                            [DataValue]    int
                          )
                        </SqlStatement>
                    </SqlSchema>
                </Chronicle>
            </Chronicles>
        </EventClass>
    </EventClasses>

 

تمام فايل‌هاي ADF بايد با عناصر برنامه شروع شوند كه همان‌گونه كه ممكن است حدس زده باشيد، برنامه Notification Services را ارايه مي‌دهند. عناصر اصلي در عنصر برنامه‌اي كه برنامه را تعريف مي‌كند، عناصر EventClasses، SubscriptionClasses و NotificationClasses هستند. ليست كد قبل حاوي بخش EventClasses از ADF است. به دليل اين كه اين برنامه نمونه تنها از يك رويداد استفاده مي‌كند، عنصر EventClasses تنها حاوي يك عنصر EventClass به نام DataEvents است. بخش طرح‌واره رويداد را تعريف مي‌كند كه برنامه Notification Services كنترل خواهد كرد. در اين مورد، دو ستون تعريف مي‌شوند: ستون DataID كه يك شناسه ساده است و ستون DataValue كه حاوي يك مقدار مرتبط است. شباهت اين دو تعريف براي ستون‌هاي SQL Server، تصادفي نيست. Notification Services از اين تعاريف براي ايجاد ستون‌ها در پايگاه داده Notification Services استفاده مي‌كند. براي اطمينان از كارآيي خوب، تگ IndexSqlSchema براي ايجاد ايندكسي روي ستون DataID به كار مي‌رود.

بخش Chronicles جداولي را تعريف مي‌كند كه داده رويداد را براي استفاده از اشتراك‌هاي زمان‌بندي شده ذخيره مي‌كند. بخش Chronicles داراي دو تگ مورد نياز است: تگ ChronicleName و تگ SqlSchema. تگ ChronicleName نام جدول Chronicle را مهيا مي‌كند و تگ SqlSchema حاوي عبارات T-SQL است كه جدول را ايجاد مي‌كنند. به دليل اين كه اين كد در طي ايجاد Notification Services و بهنگام‌رساني فرآيندها استفاده مي‌شود، ابتدا بايد وجود جدول را بررسي كند و چنانچه آن را يافت، آن را حذف كند. سپس خط بعدي T-SQL، جدول را ايجاد مي‌كند.

 

تعريف تأمين‌كننده‌هاي ADF

بعد از تعريف رويدادهايي كه برنامه را كنترل خواهند كرد، مرحله بعدي در ايجاد برنامه Notification Services، تعريف تأمين كننده‌اي است كه اين رويدادها را به برنامه تحويل خواهد داد. در اين قطعه كد از بخش بعدي فايل adf.xml، مي‌توانيد تعريفي براي تأمين كننده رويداد SQL Server مورد استفاده براي اتصال برنامه Notification Services به SQL Server ببينيد:

 

<!-- Specify the SQL Server Event Provider -->
<Providers>
    <HostedProvider>
        <ProviderName>SQLData</ProviderName>
        <ClassName>SQLProvider</ClassName>
        <SystemName>tecayukon</SystemName>
        <Schedule>
            <Interval>P0DT00H00M60S</Interval>
        </Schedule>
        <Arguments>
            <Argument>
                <Name>EventsQuery</Name>
                <Value>SELECT DataID, DataValue FROM DataEventsTable</Value>
            </Argument>
            <Argument>
                <Name>EventClassName</Name>
                <Value>DataEvents</Value>
            </Argument>
        </Arguments>
    </HostedProvider>
</Providers>

 

بخش Providers از ADF تأمين كننده‌هاي رويداد مورد استفاده برنامه Notification Services را توصيف مي‌كند. در اين مثال، عنصر HostedProvider تأمين كننده رويداد SQL Server را تعريف مي‌كند. عنصر ProviderName براي انتساب نامي به تأمين كننده استفاده مي‌شود و عنصر SystemName نام سيستم SQL Server اي را كه تأمين كننده به آن متصل خواهد شد، مهيا مي‌كند.

عنصر Schedule تعريف مي‌كند كه تأمين كننده چند وقت به چند وقت به سيستم متصل خواهد شد؛ اين فاصله زماني با مقدار تعريف شده در عنصر Interval كنترل مي‌شود. مقدار موجود در عنصر Interval از نوع داده مدت زماني XML استفاده مي‌كند. بخش 0DT اين مقدار، يك فاصله زماني تاريخي را با يك مقدار 0 نشان مي‌دهد. بخش 00HR يك فاصله زماني ساعتي را با مقدار 0 نشان مي‌دهد. بخش 00M يك فاصله زماني دقيقه‌اي را با مقدار 0 نشان مي‌دهد. بخش 60S يك فاصله زماني ثانيه‌اي را با مقدار 60 نشان مي‌دهد. به عبارت ديگر، اين فاصله زماني با 60 ثانيه تنظيم مي‌شود.

عنصر Arguments پرس‌وجويي را مهيا مي‌كند كه براي اقتباس داده از منبع رويداد استفاده خواهد شد. در اين مثال، محتويات ستون DataID and DataValue در DataEventsTable هر 60 ثانيه براي كلاس رويداد به نام DataEvents كه در عنصر EventClass قبلي تعريف شده بود، بازيابي خواهد شد.

 

تعريف طرح‌واره اشتراك ADF

هنگامي كه رويدادها توصيف شدند، مرحله بعدي در ايجاد فايل ADF، تعريف اشتراك‌هاست. اين ليست كد، بخش بعدي فايل adf.xml را نشان مي‌دهد كه اشتراك‌هاي مورد استفاده برنامه Notification Services نمونه را نشان مي‌دهد:

<!-- Describe the Subscription -->
<SubscriptionClasses>
    <SubscriptionClass>
        <SubscriptionClassName>DataSubs</SubscriptionClassName>
        <Schema>
            <Field>
                <FieldName>DeviceName</FieldName>
                <FieldType>nvarchar(255)</FieldType>
                <FieldTypeMods>not null</FieldTypeMods>
            </Field>
            <Field>
                <FieldName>SubLocale</FieldName>
                <FieldType>nvarchar(10)</FieldType>
                <FieldTypeMods>not null</FieldTypeMods>
            </Field>
            <Field>
                <FieldName>DataID</FieldName>
                <FieldType>int</FieldType>
                <FieldTypeMods>not null</FieldTypeMods>
            </Field>
            <Field>
                <FieldName>DataTriggerValue</FieldName>
                <FieldType>int</FieldType>
                <FieldTypeMods>not null</FieldTypeMods>
            </Field>
        </Schema>
        <IndexSqlSchema>
            <SqlStatement>CREATE INDEX DataSubIndex ON DataSubs
              ( DataID )</SqlStatement>
        </IndexSqlSchema>
        <EventRules>
            <EventRule>
                <RuleName>DataSubEventRule</RuleName>
                <Action>
                    SELECT dbo.DataNotificationsNotify
                      (s.DeviceName, s.SubLocale, e.DataID, e.DataValue)
                      FROM DataSubs s JOIN DataEvents e
                      ON s.DataID = e.DataID
                      LEFT OUTER JOIN DataEventsTable t
                      ON s.DataID = t.DataID
                      WHERE s.DataTriggerValue &lt;= e.DataValue
                      AND (s.DataTriggerValue &gt; t.DataValue
                      OR .DataValue IS NULL)
 
                    INSERT INTO DataEventsTable (DataID, DataValue)
                    SELECT e.DataID, e.DataValue
                      FROM DataEvents e
                      WHERE e.DataID NOT IN
                        (SELECT DataID from DataEventsTable)
 
                    UPDATE DataEventsTable
                      SET DataValue = e.DataValue
                      FROM DataEvents e, DataEventsTable t
                      WHERE e.DataID = t.DataID
                      AND e.DataValue &gt; t.DataValue
                </Action>
                <EventClassName>DataEvents</EventClassName>
            </EventRule>
        </EventRules>
    </SubscriptionClass>
</SubscriptionClasses>

 

بخش SubscriptionClasses سند ADF شبيه EventClasses مي‌تواند چندين اشتراك را توصيف كند كه هر اشتراك در يك عنصر SubscriptionClass مجزا توصيف مي‌شود. اين مثال از يك SubscriptionClass به نام DataSubs استفاده مي‌كند. بخش Schema اشتراك را توصيف مي‌كند. فيلد DeviceName نوع وسيله مقصد را نشان مي‌دهد. SubLocale براي تغيير اختياري زباني كه مشترك براي بازيابي هشدار به كار خواهد برد، استفاده مي‌شود. فيلدهاي DataID و DataTriggerValue رويدادي را مشخص خواهند كرد كه مشترك آن خواهند شد و مقدار داده‌اي كه يك هشدار را تريگر خواهد كرد. باز هم عنصر IndexSqlSchema شبيه EventClass براي ايجاد ايندكسي روي ستون DataID براي كارآيي بهتر استفاده مي‌شود. Notification Services از اين توضيحات براي ايجاد ستون‌هاي پايگاه داده در SQL Server استفاده مي‌كند. بعد از تنظيم اشتراك‌ها، بخش بعدي كد در عنصر EventRules منطقي را تعريف مي‌كند كه برنامه Notification Services براي تطابق رويدادها با اشتراك‌ها به كار خواهد برد. در حالي كه اطلاعات Event و Subscription با استفاده از XML تعريف مي‌شوند، قوانين رويداد با استفاده از كد T-SQL ايجاد مي‌گردند كه در عنصر EventRulesAction ذخيره مي‌شوند. در اين مثال، مهم‌ترين نكته قابل توجه اين است كه جدول DataSubs با جدول DataEvents تلفيق مي‌شود كه DataValue از جدول DataEvents بزرگ‌تر از DataTriggerValue است ولي كوچك‌تر از مقدار جديد است. هنگامي كه شرط تلفيق برآورده مي‌شود، رديفي براي مشترك ايجاد خواهد شد. عبارات INSERT و UPDATE براي بهنگام‌رساني جدول Chronicle هنگام پيدا نشدن يك مقدار يا هنگامي كه مقدار بزرگ‌تر از مقدار Chronicle موجود باشد، استفاده مي‌شود.

 

طرح‌واره هشدار ADF

بخش بعدي تعريف فايل ADF، تنظيم طرح‌واره NotificationClasses است. NotificationClasses نحوه تحويل اطلاعات هشداردهي را توصيف مي‌كند. اين ليست كد بخش آخر فايل adf.xml است كه حاوي تعريف NotificationClass است. عنصر NotificationClasses مي‌تواند چندين نوع هشداردهي را توصيف كند كه هر نوع در عنصر NotificationClass خاص خود توصيف مي‌شود. به دليل اين كه اين برنامه نمونه تنها از يك نوع هشداردهي استفاده مي‌كند، بخش NotificationClasses حاوي يك عنصر NotificationClass است.

<!-- Describes the Notifications -->
<NotificationClasses>
    <NotificationClass>
        <NotificationClassName>DataNotifications</NotificationClassName>
        <Schema>
            <Fields>
                <Field>
                    <FieldName>DataID</FieldName>
                    <FieldType>int</FieldType>
                </Field>
                <Field>
                    <FieldName>DataValue</FieldName>
                    <FieldType>int</FieldType>
                </Field>
            </Fields>
        </Schema>
        <!-- Specify the Content Format XSLT -->
        <ContentFormatter>
            <ClassName>XsltFormatter</ClassName>
            <Arguments>
                <Argument>
                    <Name>XsltBaseDirectoryPath</Name>
                    <Value>C:\NSSample</Value>
                </Argument>
                <Argument>
                    <Name>XsltFileName</Name>
                    <Value>NSSample.xslt</Value>
                </Argument>
            </Arguments>
        </ContentFormatter>
    </NotificationClass>
</NotificationClasses>
<Generator>
    <SystemName>tecayukon</SystemName>
</Generator>
<Distributors>
    <Distributor>
        <SystemName>tecayukon</SystemName>
    </Distributor>
</Distributors>
<ApplicationExecutionSettings>
    <PerformanceQueryInterval>PT5S</PerformanceQueryInterval>
</ApplicationExecutionSettings>
 
</Application>

 

در اين ليست، مي‌توانيد ببينيد كه كلاس هشداردهي DataNotifications ناميده مي‌شود. عنصر Schema كلاس‌هاي DataNotification اطلاعاتي را تعريف مي‌كند كه به مشترك ارسال خواهد شد. در اين‌جا مي‌توانيد ببينيد كه مقدار فيلدهاي DataID و DataValue به عنوان بخشي از هشداردهي ارسال خواهند شد.

عنصر ContentFormatter نحوه فرمت‌بندي هشداردهي را هنگام ارسال به مشترك تعريف مي‌‌كند. اين مثال كاربرد XSLFormatter را تشريح مي‌كند. عنصر Arguments دايركتوري محل فايل XSLT و نام فايل را توصيف مي‌كند. در اين ليست، مي‌توانيد ببينيد كه فايل XSLT در دايركتوري C:\NSSample قرار دارد و NSSample.xslt ناميده مي‌شود.

عناصر Generator، Distributor و ApplicationExecutionSettings سيستم SQL Serverاي كه براي توليد هشدارها استفاده خواهد شد، سيستمي كه براي توزيع هشدارها استفاده خواهد شد و فاصله زماني را كه در آن، شمارنده‌هاي كارآيي سيستم بهنگام خواهند شد، مشخص مي‌كنند.

 

فرمت‌بندي خروجي هشداردهي

در ليست قبل، گفتيم كه هشداردهي با استفاده از شيوه‌نامه NSSample.xslt فرمت‌بندي مي‌شود. مي‌توانيد در ليست زير ببينيد كه اين شيوه‌نامه نمونه چه شكلي است:

 

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="notifications">
    <HTML>
    <BODY>
      <xsl:apply-templates />
      <I>This message was generated using
      <BR/>Microsoft SQL Server Notification Services</I><BR/><BR/>
    </BODY>
    </HTML>
  </xsl:template>
  <xsl:template match="notification">
    <P>The data value of <B><xsl:value-of select="DataID"/></B>
    <BR/>reached the value <B><xsl:value-of select="DataValue"/></B>
    </P>
  </xsl:template>
</xsl:stylesheet>
 

شيوه‌نامه مورد استفاده براي فرمت‌بندي خروجي برنامه Notification Services، يك شيوه‌نامه HTML استاندارد است. در بخش قالب، مي‌توانيد ببينيد كجا فيلدهاي DataID و DataValue از NotificationClass در هشداردهي نمايش داده مي‌شود.

 

ايجاد برنامه Notification Services

بعد از ايجاد كد برنامه T-SQL و XML مورد نياز، آماده ساخت برنامه Notification Services هستيد. برنامه‌هاي Notification Services مي‌توانند به صورت محاوره‌اي با استفاده از SQL Server Management Studio ايجاد شوند يا مي‌توانند با استفاده از برنامه سودمند nscontrol ايجاد گردند.

 

ايجاد برنامه‌هاي Notification Services با استفاده از SQL Server Management Studio

بعد از اين كه فايل‌هاي config.xml و adf.xml كه Notification Services را تعريف مي‌كنند، ايجاد شدند، مي‌توانيد از آن‌ها براي ساخت برنامه Notification Services خود از SQL Server Management Studio با باز كردن Object Browser و كليك راست روي گره Notification Services استفاده كنيد. سپس، مي‌توانيد گزينه New Notification Services Instance از منوي زمينه را براي نمايش صفحه‌اي شبيه شكل 3-5 انتخاب كنيد.

 

شكل 3-5 كادر محاوره‌اي New Notification Services Instance

 

براي ايجاد يك برنامه NotificationClasses جديد با استفاده از كادر محاوره‌اي New Notification Services Instance، روي Browse كليك كرده و به دايركتوري حاوي فايل config.xml برنامه خود برويد. سپس، فايل config.xml را انتخاب كرده و OK را كليك كنيد. اگر بخواهيد برنامه بلافاصله بعد از ايجاد فعال شود، بايد كادر انتخاب Enable Instance After It Is Created را در حالت تأييد قرار دهيد.

 

ايجاد برنامه‌هاي Notification Services با استفاده از Nscontrol

Nscontrol يك ابزار خط فرمان است كه براي ايجاد و راهبري برنامه‌هاي Notification Services استفاده مي‌شود. Nscontrol تعداد فرامين عمل مختلفي را كه مي‌توانيد براي كار كردن با برنامه‌هاي Notification Services استفاده كنيد، مي‌داند. جدول 1-5 فرامين عمل nscontrol موجود را فهرست كرده است.

 

جدول 1-5 فرامين nscontrol

فرمان Nscontrol

شرح

nscontrol create

يك برنامه Notification Services و پايگاه‌هاي داده آن را ايجاد مي‌كند.

nscontrol delete

يك برنامه Notification Services و پايگاه‌هاي داده آن را حذف مي‌كند.

nscontrol disable

يك برنامه Notification Services را غيرفعال مي‌كند.

nscontrol displayargumentkey

كليد مورد استفاده براي رمزگذاري داده رويداد را نمايش مي‌دهد.

nscontrol enable

برنامه Notification Services را فعال مي‌كند.

nscontrol listversions

نگارش Notification Services و هر يك از برنامه‌هاي رجيستر شده را نمايش مي‌دهد.

nscontrol register

يك برنامه Notification Services را رجيستر مي‌كند.

nscontrol status

وضعيت يك برنامه Notification Services را نمايش مي‌دهد.

nscontrol unregister

يك برنامه Notification Services را از حالت رجيستر شده بر مي‌دارد.

nscontrol update

يك برنامه Notification Services را بهنگام مي‌كند.

 

ايجاد يك برنامه Notification Services يك فرآيند چند مرحله‌اي است. ابتدا، برنامه نياز به ايجاد با استفاده از فرمان nscontrol create دارد. اين امر پايگاه داده مورد استفاده برنامه Notification Services را ايجاد مي‌كند. سپس، برنامه بايد با استفاده از فرمان nscontrol register رجيستر شود. اين امر سرويسي را ايجاد مي‌كند كه براي اجراي برنامه استفاده مي‌شود. فايل دسته‌اي زير، توالي فرمان مورد نياز براي ايجاد برنامه NSSample Notification Services نمونه را تشريح مي‌كند:

echo off
cls
set NSdir="C:\Program Files\Microsoft SQL Server\90\NotificationServices\9.0.242\bin"
echo ========================================
echo Beginning NSSampleInstance Creation
echo ========================================
echo .
echo Create the application databases
%NSdir%\nscontrol create -in config.xml
 
echo Register the application
%NSdir%\nscontrol register -name NSSampleInstance –service
 
echo Enable the application
%NSdir%\nscontrol enable -name NSSampleInstance
 
echo start the NS app as a service
net start NS$NSSampleInstance
 
echo Display the status of the app
%NSdir%\nscontrol status -name NSSampleInstance

 

آرگومان –n فرمان nscontrol create، نام Notification Services ACF را مشخص مي‌كند. در اين مثال، ACF، config.xml ناميده مي‌شود. اجراي فرمان nscontrol create باعث ايجاد دو پايگاه داده در سرور مي‌شود: NSSampleInstanceMain و NSSampleInstanceNSSample كه رويدادهاي داده و تعريف برنامه Notification Services را ذخيره مي‌كنند.

فرمان nscontrol register از آرگومان –name براي تعيين نام نمونه برنامه Notification Services براي رجيستر شدن استفاده مي‌كند. سوييچ –service آن را براي رجيستر كردن سرويسي به نام NS$NSSampleInstance هدايت مي‌كند. فرمان nscontrol enable از پارامتر –name براي تعيين نام نمونه برنامه‌اي كه فعال خواهد شد، استفاده مي‌كند.

هنگامي كه برنامه فعال مي‌شود، سرويس آن مي‌تواند با استفاده از فرمان net start اجرا شود. براي امتحان، هم‌چنين مي‌توانيد برنامه NS$NSSampleInstance از اعلان فرمان يا كادر محاوره‌اي Run استفاده كنيد.

 

افزودن مشتركين برنامه

مشتركين با استفاده از APIهاي كد مديريت شده‌اي كه مايكروسافت در SQL Server 2005 Notification Services فراهم كرده است، به برنامه‌هاي Notification Services اضافه مي‌شوند. APIهاي Microsoft .NET Framework به شما امكان اضافه كردن، بهنگام‌رساني و حذف مشتركين و وسايل و اشتراك‌هاي مشتركين را مي‌دهد. در حالي كه Notification Services API از طريق كلاس‌هاي كد مديريت شده فراهم شده است، هم‌چنين مي‌توانيد با استفاده از برنامه‌هاي COM مبتني بر Win32 از كد مديريت نشده به آن API دستيابي داشته باشيد.

Notification Services API در Microsoft.SqlServer.NotificationServices.dll قرار دارد و بايد به عنوان يك مرجع به پروژه .NET اضافه شود. سپس، مي‌توانيد از كلاس‌هاي Notification Services براي مديريت اشتراك‌ها براي برنامه‌هاي Notification Services خود استفاده كنيد. اين نمونه كد، نحوه افزودن يك اشتراك را با استفاده از API كد مديريت شده نشان مي‌دهد:

 

using Microsoft.SqlServer.NotificationServices;
using System.Text;
 
public class NSSubscriptions
{
    private string AddSubscription(string instanceName, string
      applicationName, string subscriptionClassName, string subscriberId)
    {
        // Create the Instance object
        NSInstance myNSInstance = new NSInstance(instanceName);
 
        // Create the Application object
        NSApplication myNSApplication = new NSApplication
         (myNSInstance, applicationName);
 
        // Create the Subscription object
        Subscription myNSSubscription = new Subscription
          (myNSApplication, subscriptionClassName);
        myNSSubscription.Enabled = true;
        myNSSubscription.SubscriberId = subscriberId;
 
        // Set the subscription data fields
        myNSSubscription["DeviceName"] = "MyDevice";
        myNSSubscription["SubscriberLocale"] = "USA";
        myNSSubscription["DataID"] = 1;
        myNSSubscription["DataTriggerValue"] = 100;
 
        // Add the subscription
        string subscriptionId = myNSSubscription.Add();
        return subscriptionId;
    }
}

 

در بالاي اين ليست، مي‌توانيد يك رهنمود import را براي فضاي نام Microsoft.SqlServer.NotificationServices ببينيد. استفاده از رهنمود import به شما امكان استفاده از كلاس‌ها را در فضاي نام NotificationServices بدون نياز به تعيين كامل اسامي مي‌دهد. سپس، در داخل متد AddSubscriptions، مي‌توانيد كدي را ببينيد كه اشتراكي را اضافه مي‌كند. ابتدا يك شئ نمونه Notification Services ايجاد شده و بعد از آن شئ Application مي‌آيد. سپس، شئ Application براي ايجاد يك شئ اشتراك به نام myNSSubscriptions استفاده مي‌شود. مقاديري به خصوصيات شئ Subscription نسبت داده شده و سپس متد Add آن براي افزودن اشتراكي به پايگاه داده فراخواني مي‌شود.

 



[1]- Notification Services

[2]- Subscriptions

[3]- Notification

[4]- Event Providers

[5]- File System Watcher

[6]- Distributor

[7]- Application Definition File

[8]- Application Configuration File