Оптимизация работы серверов баз данных Microsoft SQL Server 2005

Введение в службы Notification Services

Разбить на страницы
Показывать лекцию целиком

В предыдущей лекции вы научились использовать службы Reporting Services, предоставляемые SQL Server. В данной лекции речь пойдет о службах Notification Services, еще одном компоненте SQL Server. Службы Notification Services - мощный компонент SQL Server, который позволяет разработчикам быстро спроектировать, реализовать и развернуть масштабируемое приложение уведомлений. Эти задачи решаются посредством значительной автоматизации двух основных элементов: автоматизации всех процессов, вовлеченных в выполнение решения, и автоматизации создания и управления объектами базы данных и приложения.

Такая автоматизация обеспечивает выигрыш в производительности, но требует, чтобы процесс проектирования отвечал принципу, который службы Notification Services используют для работы с уведомлениями. Это означает, что нужно понимать терминологию, архитектуру и механику платформы. Начальная кривая обучения может показаться непреодолимой, поэтому в данной лекции будет продемонстрировано, как применить принципы служб Notification Services к развитию событий в реальном мире.

Сценарий для служб Notification Services

Птицландия - воображаемая страна, которая имеет давние традиции в области птицеведения. Птицеведение занимается наблюдением за жизнью птиц в реальных условиях, сбором информации о том, когда птицы прилетают и улетают, выводят птенцов, сколько птиц насчитывается в данной местности и т. д. Птицеведы обычно любят делиться информацией о том, каких птиц, когда и где они наблюдали.

Вы получили запрос на создание приложения уведомлений на заказ. Ваш клиент – Национальное орнитологическое общество Птицландии; ему необходимо уведомлять своих членов о наблюдениях за птицами по всей стране. Заинтересованные люди должны иметь возможность выбрать уведомление о наблюдениях в определенном регионе или в нескольких регионах страны.

Определение требований

Имея под рукой данный сценарий, вы начинаете разрабатывать черновую схему базы данных. Конечно, в реальном мире до того, как перейти к разработке базы данных, вы займетесь списком требований, разработкой схем UML (Unified Modeling Language, универсального языка моделирования) и другими элементами, но для облегчения восприятия материала в данной лекции мы немного сократим этот процесс.

Предварительные требования

Вероятнее всего, схема включает объекты, показанные в табл. 9.1. Имеет смысл попытаться разработать такое приложение, которое можно было бы использовать повторно в других ситуациях, не имеющих отношения к птицеведению. Следовательно, мы назовем общие объекты родовыми именами, что позволит использовать их повторно, не переписывая общие элементы.

Объекты схемы птицеведческого приложения
ОбъектИмя
Список регионов Region
Список наблюдений Events
Список заинтересованных людей Subscribers
Список регионов, сведения о которых интересуют данное лицо Subscriptions

Получается, что три последних имени совпадают с терминами служб Notification Services. Но первый объект, Regions, содержит специфическую для приложения информацию и не совпадает ни с одним из терминов служб Notifications Services.

Дополнительные требования

Наблюдения за птицами делятся на три категории:

  • Наблюдения за обычным расселением птиц в регионе, которые можно вести в течение всего года
  • Наблюдения за прилетом в регион перелетных птиц
  • Наблюдения за редкими птицами Редкие птицы могут останавливаться в регионе на непродолжительное время, а затем не появляться в нем несколько лет. Следовательно, некоторые птицеведы были бы очень заинтересованы в информации об их появлении.
  • Таким образом, наше приложение должно отвечать следующим требованиям:

  • Подписчики должны иметь возможность подписаться на немедленные уведомления о наблюдениях редких птиц и/или уведомления по регулярному расписанию о не столь срочных событиях.
  • Подписчики должны иметь возможность получить уведомления на выбранное ими устройство. Особенно заинтересованные птицеведы хотели бы получать особые уведомления в виде SMS (коротких текстовых сообщений) на свои мобильные телефоны. Остальные подписчики, возможно, предпочли бы ежедневные или еженедельные уведомления по электронной почте.
  • Эти два требования вызывают необходимость некоторых изменений в схеме приложения. Нам придется отслеживать следующие моменты:

  • Предпочитаемое устройство назначения для каждого подписчика.Информация об устройстве включает адрес электронной почты, номер мобильного телефона и т. п.
  • Какая подписка какому устройству соответствует.Например, срочные уведомления должны отсылаться на мобильный телефон, а периодические - по электронной почте.
  • Периодичность уведомлений.Периодичность может выражаться значениями немедленно, ежедневно или еженедельно.
  • Категория наблюдений.Для данного примера мы выделим три категории: обычные, перелетные, редкие.
  • Какие уведомления по какой подписке следует отправлять.Необходимо хранить дату и время наступления события, а также дату и время передачи информации приложению. Получив эту информацию, приложение уведомлений должно определить, например, какие события были отправлены по ежедневной подписке, а какие из них пока не были отправлены по еженедельной подписке.
  • Как обеспечить соответствие этим требованиям?

  • Сведения об устройствах подписчиков должны храниться вместе с информацией о подписчиках.
  • Информация о том, какое устройство какой подписке соответствует, должна храниться вместе с информацией о подписке.
  • Информация о времени должна храниться вместе с информацией о подписке.
  • Информация о категории должна храниться вместе с событием, причем это значение должно быть предоставлено лицом, наблюдавшим событие. Таким образом, если кто-либо вводит информацию о наблюдении в решение для уведомления, он обязан указать категорию - обычные птицы, перелетные птицы или редкие птицы.
  • Архивная информация

    Управлять архивной информацией несколько сложнее. Необходимо сравнивать дату и время наступления вводимого события с датой и временем последней операции отправки уведомления. Наша схема базы данных не содержит никакой информацией о том, когда отправляются уведомления. Следовательно, нам нужно отслеживать обработку уведомлений.

    Для этого можно выбрать одну из двух моделей:

  • Запись даты и времени обработки подписки по типам. Придется записывать тип подписки (ежедневная или еженедельная) вместе с датой и временем, когда был запущен процесс отправки. При запуске процесса отправки система сохраняет текущие значения даты и времени. В результате получается только две записи: одна для еженедельных подписок и одна для ежедневных подписок.
  • Запись даты и времени обработки каждой подписки. Записывается идентификатор конкретной подписки вместе со значениями даты и времени начала обработки или идентификатор последнего события, включенного в уведомление.
  • Какую из двух моделей выбрать? Вести запись дат по типам подписки проще, чем по каждой подписке. Первый вариант требует хранения только одной записи для каждого типа подписки. Второй подход требует хранения по одной записи для каждой подписки и некоторой логики для поддержания синхронности обеих таблиц (подписок и процессов). Однако в случае, если уведомление не доставляется, подход по типам не позволит пострадавшему подписчику когда-либо получить уведомление. Этот недостаток может быть допустимым в некоторых не имеющих критической важности приложениях уведомлений, но он будет неприемлемым в другой группе приложений, например, в тех, которые связаны с ожиданием действий со стороны подписчика (необходимость обратного звонка, изменения контракта, жалобы клиента и т. д.). Действительно, даже подписчики, которые подписаны на получение уведомлений, не являющихся критически важными, предпочли бы не пропустить ни одного события. Следовательно, из соображений повторного использования и обеспечения полноты предоста вляемой информации, следует предпочесть второй вариант.

    Совет. В терминах служб Notification Services, архивные данные хранятся в таблицах хроники.

    Разнообразие устройств

    Из-за того, что наше приложение должно отправлять уведомления на различные устройства и носители, возникают некоторые дополнительные требования. Сообщения электронной почты должны доставляться при помощи сервера SMTP, а SMS-сообщения с помощью сервера текстовых сообщений. Кроме того, формат сообщений электронной почты, обычно HTML, не подходит для отправки текстовых сообщений SMS, и наоборот. Следовательно, решение должно уметь отсылать разные байты на различные типы серверов. Это проблема конфигурации, но она имеет некоторое отношение и к архитектуре приложения.

    Для реализации этих функций также существует несколько возможностей, от жесткого программирования процесса построения сообщения в приложении до использования программ сторонних разработчиков для обработки процесса преобразования. Службы Notification Services решают эту проблему с учетом открытости системы: для каждого типа устройств необходимо предоставить файл XSLT (eXtensible Stylesheet Language Transformation, преобразования расширяемого языка стилей) (для полноты нужно иметь комбинацию файла XSLT для каждого устройства и языкового стандарта). Механизм XSLT может использовать XSLT-шаблон для преобразования ввода XML в вывод других типов (HTML, XML или текст). Следовательно, это весьма подходящий способ для удовлетворения некоторых требований.

    Информация уведомления

    Внутренние процессы приложения будут управлять информацией в модуле подготовки, который не является дружественным к пользователю.

    Например, приложение ссылается на все объекты не по имени, а по числу-идентификатору. Однако, при подготовке данных для реальной доставки конечному пользователю, преобразование идентификаторов в текстовую информацию обязательно.

    Чтобы ускорить формирование окончательного уведомления для доставки, следует подготовить информацию, которая нужна этому процессу. Например, вместо хранения идентификатора региона следует хранить название региона. Кроме того, вместо идентификатора события следует хранить описание события. Таким образом, когда механизм примет решение отравить уведомление, для получения нужной информации ему не придется выполнять соединения и поиск по нескольким таблицам..Он просто прочитает запись в таблице, в которой все данные подготовлены в соответствии с его требованиями и готовы для отправки подписчику.

    Соображения производительности и масштабируемости

    Хотя наш клиент мог ничего не сказать о проблемах производительности, нам следует иметь их в виду. Сообщения электронной почты и текстовые сообщения должны доставляться подписчикам в индивидуальном порядке. Известно, что записать строку в таблицу гораздо быстрее, чем отправить сообщение по электронной почте, главным образом, вследствие сетевых задержек. В случае отсылки уведомлений большому количеству подписчиков через короткие промежутки времени может возникнуть узкое место, вследствие чего полезность приложения снизится. Необходимо предусмотреть возможные способы минимизации рабочей нагрузки процесса доставки. У нас есть две возможности ускорить время доставки:

  • Уменьшить время, отводимое на отправку каждого сообщения
  • Уменьшить количество отправляемых сообщений
  • Уменьшить время, необходимое для отправки отдельного сообщения, можно несколькими способами:

  • Использование более скоростных аппаратных устройств
  • Использование более скоростных сетевых устройств
  • Уменьшение размера сообщения
  • Какой бы способ вы не выбрали, время, которое требуется на отправку одного сообщения электронной почты или текстового сообщения, будет зависеть от характеристик сети, которые вы не можете контролировать. Следовательно, следует предпочесть уменьшение количества отправляемых сообщений. Проанализировав характер уведомлений, можно заметить, что многие подписчики разделяют интерес к данному региону, и лишь некоторые подписчики подписались на уведомления о событиях в нескольких регионах. Если это так, можно уменьшить количество отправляемых сообщений следующими способами:

  • Путем отправки одного сообщения электронной почты всем подписчикам с одинаковыми интересами. Например, все подписчики, интересующиеся Севером Птицландии, могут получать одинаковые сообщения.
  • Слить все запланированные уведомления определенного подписчика в одно уведомление, чтобы, например, подписчик, которого интересуют три соседних региона, получил бы одно уведомление вместо трех.Примечание Последние требования в разрабатываемом нами сценарии реализованы не будут. Они упомянуты здесь только для полноты описания.
  • Создание приложения

    К этому моменту мы только собрали информацию о требованиях и начали думать о том, как следует их реализовать. Мы только приступили к работе.

    Мы выбрали для разработки этого приложения службы Notification Services. Службы Notification Services помогут ускорить разработку приложения; кроме того, они предлагают платформу для вызова приложения, когда это, в конце концов, потребуется. Следовательно, нужно иметь представление о том, как наши требования преобразуются в объекты службы Notification Services, а также о процессах компоновки, развертывания и тестирования приложений Notification Services.

    В следующем разделе данной лекции приводится информация по следующим вопросам::

  • Компоненты приложений служб Notification Services
  • Преобразование требований нашего примера Птицеводство в элементы служб Notification Services.
  • Создание инфраструктуры разработки, состоящей из базы данных приложения и проекта разработки.
  • Создание основы приложения служб Notification Services
  • Выполнение первоначального развертывания
  • Дальнейшее добавление функций к приложению для удовлетворения требований
  • Компоненты приложений уведомлений

    Теперь, когда вы получили базовые знания о данных, которыми будет управлять приложение, необходимо подумать о том, как должна происходить обработка этих данных. Кроме схемы каждому приложению нужен механизм, чтобы поддерживать работу приложения и работать с данными. В составе механизма решения для уведомлений должны быть реализованы следующие компоненты.

  • Сервер SQL Server 2005.Служит для размещения базы данных (как схемы, так и данных) и компонентов служб Notification Services.
  • Подписывающее приложение.Предоставляет конечным пользователям интерфейс для ввода и редактирования информации о подписке и устройстве. В нашем примере мы не будем создавать такое приложение. Вместо этого будут использоваться особые приложения для ввода в приложение информации о подписчиках, устройствах подписчиков и данных о подписке. Иногда этот интерфейс не является собственно интерфейсом, а представляет собой триггер другого приложения, например, приложения управления клиентами или кадрами.
  • Механизм получения событий, генерируемых во внешнем мире.Службы Notification Services реагируют на события, но как они узнают о них? Службы Notification Services имеют несколько поставщиков событий, которые позволяют передавать события этим службам. Среди поставщиков событий - API объекта событий (модель объекта), Загрузчик XML и API SQL Server, предназначенный для загрузки событий при помощи хранимых процедур. Дополнительную информацию об этих поставщиках можно найти в документации служб Notification Services. В примере с Птицландией для ввода событий непосредственно в соответствующие места мы воспользуемся другим сценарием. Такие события запускают генерирование уведомления и процесс доставки.
  • Механизм сопоставления событий подпискам.Сам механизм предоставляется службами Notification Services. Однако вам придется информировать службы Notification Services о том, какие отношения имеются между событиями и подпиской, через так называемое правило сопоставления. Правило сопоставления - это обычная инструкция SQL, которая выбирает такие подписки, которые должны получать определенное событие. В нашем примере правило сопоставления сопоставляет события в определенном регионе с подписчиками, обладающими подписками на этот регион. Таким образом, если для отдельного региона наступает событие, все подписчики, имеющие подписки на этот регион, должны получить уведомления. Нужная нам инструкция SQL должна возвратить список подписок, которые соответствуют определенному региону.
  • Механизм физического формирования уведомления.После того, как приложению стало известно, какие уведомления и на какие устройства подписчиков следует отправить, необходимо скомпоновать содержимое, включающее всю необходимую текстовую информацию и форматирование. Службы Notification Services для формирования окончательного уведомления используют шаблоны XSLT. Функции Notification Services включают возможность отправки уведомлений на разных языках (в терминологии служб Notification Services они называются культурами). Если вы решили не использовать многоязычные функции, службы Notification Services все равно требуют указания культуры, которая будет использоваться в процессе работы. Этому механизму потребуются шаблоны XSLT для электронных сообщений в формате HTML и для текстовых SMS-сообщений. Необходимо указать службам Notification Services, когда и какой шаблон следует использовать.
  • Механизм доставки для реальной отправки уведомлений на индивидуальные целевые устройства.Когда информация для уведомления собрана, и шаблон XSLT подготовлен, службы Notification Services отправляют уведомление на сервер доставки или сервер, который будет выполнять окончательную доставку на устройство подписчика. Службы Notification Services предоставляют и этот механизм. Он оптимизирован в отношении производительности и масштабируемости. Информация о конфигурации, необходимая службам Notification Services для подключения к серверам доставки, а именно: имена серверов, IP-адреса и информация для аутентификации - должны быть предоставлены вами.Примечание. В нашем примере, чтобы упростить процесс настройки, мы воспользуемся каналом доставки File, а не сервером SMTP или SMS. В документации по службам Notification Services есть информация о том, как настроить канал доставки SMTP. Для SMS необходимо написать код самостоятельно или воспользоваться решением сторонних разработчиков. Хотя сначала это может показаться слишком трудным, вспомните о возможности использования веб-служб на базе служб сторонних разработчиков, а также о том, как легко можно написать клиент веб-службы в инфраструктуре .NET.
  • Как службы Notification Services ожидают наших указаний

    Как передать службам Notification Services информацию, о которой говорилось в предыдущем разделе?

    Службы Notification Services используют два конфигурационных XML-файла: конфигурационный файл экземпляра (ICF) и файл определения приложения (ADF). Файл ADF содержит большую часть параметров приложения, связанных с конфигурацией, но что представляет собой файл ICF?

    Экземпляр служб Notification Services.Службы Notification Services -это компонент, предназначенный для обслуживания нескольких приложений уведомлений на одном и том же программном и аппаратном обеспечении сервера. Это означает, что можно развернуть на одном сервере несколько приложений уведомлений. Службам Notification Services известно, что в таком случае вы с большой вероятностью будете повторно использовать информацию о подписчике и устройстве подписчика более чем в одном решении или приложении, поэтому они хранят эту информацию независимо от данных решения для уведомлений. Данные о подписчике хранятся в базе данных экземпляра, тогда как данные об устройстве подписчика размещаются в базе данных приложения. Обе базы данных получают имена в соответствии с некоторыми внутренними правилами, как вы вскоре убедитесь.

    Кроме того, службы Notification Services создают службу Windows для отслеживания всех событий, имеющих отношение к приложению, которое обслуживает экземпляр. Каждый экземпляр поддерживается уникальной веб-службой. Таким образом, экземпляр можно рассматривать как экземпляр веб-службы, управляющей несколькими приложениями служб Notification Services.

    Приложение служб Notification Services.База данных для приложения, которое мы пытаемся построить, будет хранить некоторую специфическую информацию и, хотя мы предполагаем повторное использование, понятно, что приложение уведомлений о курсе акций, приложение уведомлений о результатах футбольных матчей и приложение уведомлений о наблюдениях за птицами будут хранить различные виды данных. Следовательно, схемы, ассоциированные с каждым из этих приложений, будут отличаться в большей или меньшей степени. Задача служб Notification Services – управление данными приложения по вашему поручению; при этом для выполнения своей работы они добавляют таблицы, представления, хранимые процедуры, триггеры и любые инструменты служб Notification Services. В результате службы Notification Services запрашивают получение информации от схемы тем способом, который они могут понять и которым могут управлять самостоятельно. Это "понятный способ" в действительности представляет собой XML-файл, который привязан к оп ределенной XML-схеме (XSD). Этот файл похож на сценарий базы данных для создания таблиц, хотя он написан на XML.

    Внутренние базы данных служб Notification Services.При отсутствии других указаний, в процессе развертывания конфигурационных файлов на сервере, процесс развертывания создает как минимум две базы данных: одну для данных экземпляра, и еще по одной для каждого приложения, обслуживающего экземпляр. Имена этих баз данных должны соответствовать следующему шаблону:

  • База данных экземпляра получает имя <имя_экземпляра>NSMain. В нашем примере это имя SQL2005StepByStepNSMain.
  • База данных приложения получает имя <имя_экземпляра><имя_п-риложения>. В нашем примере это имя SQL2005StepByStepBirding.Примечание. В SQL Server 2005 можно использовать любые базы данных по вашему выбору для хранения объектов элементов служб Notification Services, относящихся как к приложению, так и к экземпляру. Notification Services генерирует и управляет многими объектами SQL Server, следовательно, необходимо указать имя схемы, где будут группироваться эти объекты.

    Поскольку количество генерируемых объектов значительно, следует использовать общие базы данных только в определенных обстоятельствах. В нашем примере общие базы данных вполне подойдут, поскольку дополнительная информация, которую мы будем использовать, не может оправдать создание отдельной базы данных. Следовательно, можно создать базу данных приложения и дать указание службам Notification Services дополнить ее своими объектами вместо того, чтобы создавать новую базу данных.

  • Требования, преобразованные в объекты служб Notification Services

    Наш контрольный список требований состоит из следующих пунктов:

  • Схема базы данных, в том числе:
  • Специфическая информация приложения, список доступных регионов.
  • События: список актуальных наблюдений за птицами по категориям.
  • Подписчики: список заинтересованных людей
  • Подписки: список регионов, интересующих определенного подписчика, желательная периодичность получения уведомлений и устройство назначения
  • Устройства подписчиков: адреса электронной почты и номера мобильных телефонов
  • Хроники: архивные данные об уведомлениях
  • Детализированные данные, готовые для уведомления
  • Сценарии для:
  • Ввода информации о подписчиках, устройствах подписчиков, сведений о подписке в приложении
  • Ввода событий
  • Инструкция SQL для правила сопоставления
  • Элементы, имеющие отношение к доставке:
  • Шаблоны XSLT для сообщений электронной почты в формате HTML и текстовых сообщений SMS
  • конфигурационная информация, необходимая для подключения к серверам доставки
  • Элементы, преобразованные в элементы служб Notification Services

    К этому моменту мы уже знаем, что приложение служб Notification Services должно включать следующие элементы:

  • Особая база данных приложения, содержащая все данные, не относящиеся к службам Notification Services:
  • Схема регионов
  • Схема типов подписок
  • Схема информации о подписчиках
  • Файл ICF, или конфигурационный файл экземпляра
  • Информация о конфигурации системы
  • Информация о конфигурации экземпляра
  • Файл ADF, или файл определения приложений, включающий:
  • Схему событий
  • Схему подписки
  • Схему уведомлений
  • Схему хроник
  • Правило сопоставления
  • Для удобства, проект разработки (SQL Server Management Studio), включающий:
  • Сценарий SQL для формирования тестовых данных
  • Файлы XSLT
  • Файлы ICF
  • Файлы ADF
  • Обратите внимание, что мы ничего не сказали о схемах подписчиков и устройствах подписчиков. Службы Notification Services будут управлять ими и диктовать свою схему. Эта предоставляемая службами схема отвечает нашим требованиям. Однако, если бы она нам не подходила, нам пришлось бы добавить в особую базу данных приложения дополнительные данные и использовать поле SubscriberID в схеме служб Notification Services в качестве логического соединения обоих источников.

    Инфраструктура разработки

    Теперь давайте приступим к созданию нашего приложения. SQL Server Management Studio не включает шаблон для проектов служб Notification Services, хотя можно создать проект для размещения файлов, имеющих отношение к службам Notification Services.

    Вместо того, чтобы начинать с нуля, воспользуемся для создания приложения уведомления по птицеводству проектом Tutorial. Это приложение даст нам сценарии, необходимые для заполнения базы данных и ввода некоторых событий.

    Установка примеров (образцов) SQL Server.Далее в материале этой лекции используется пример Tutorial, который включен в образцы к службам Notification Services. Хотя для того, чтобы изучать содержание данной лекции, примеры устанавливать необязательно, образцы к службам Notification Services, поставляемые с SQL Server 2005 помогут лучше понять службы Notification Services в целом, путем сравнения нескольких бизнес-сценариев и решений для них. Чтобы установить образцы SQL Server 2005, ознакомьтесь с темой "Установка образцов" в Электронной документации по SQL Server 2005/

    Кроме того, можно установить примеры и изучить темы Учебника по службам Notification Services в дополнение к материалам этой лекции.

    Совет. Раздел "Образцы: службы Notification Services" в Электронной документации по SQL Server 2005 включает тему, которая называется "Диагностика образцов" и может помочь вам при возникновении непредвиденных ошибок в процессе изучения действий, описанных далее в этой лекции.

    Создаем новый проект для служб Notification Services

    Хотя службы Notification Services работают со всеми элементами, имеющими отношение к уведомлениям, они не работают со специфическими данными приложения. В сценарии Птицеводство это означает, что службы Notification Services не будут обслуживать информацию о доступных регионах или категориях наблюдений.

    Аналогично, службы Notification Services будут содержать минимум данных о самих подписчиках, сохраняя для каждого из них только идентификатор. Если нужно отслеживать информацию о подписчиках, следует подумать о разработке стандартного приложения или использовать решение, основанное на членстве. Идентификатор, хранимый службами Notification Services, представляет собой связь между службами и решением для отслеживания информации о подписчиках.

    В нашем примере вы создадите базу данных для хранения всей информации, не специфичной для служб Notification Services. Эта база данных очень простая, но она полезна в качестве примера.

    Создаем особую базу данных приложения

  • В меню Start (Пуск) выберите All Programs,. Microsoft SQL Server 2005, SQL Server Management Studio (Все программы, Microsoft SQL Server 2005, Среда SQL Server Management Studio).
  • В меню File (Файл) выберите команду Open (Открыть), затем File (Файл). Найдите в папке My Documents\MicrosoftPress\ SQLAppliedTechSBS\Chapter13 сценарий BirdingDatabase Creation.sql.
  • Измените путь к файлу базы данных, чтобы он указывал на папку, в которой вы хотите создать базу данных.
  • Выполните сценарий, чтобы создать базу данных, таблицы и содержимое таблиц.
  • Создаем проект и решение SQL Server 2005 Management Studio

  • Откройте SQL Server Management Studio и установите соединение с сервером базы данных.
  • В меню File (Файл) выберите New, Project (Создать, Проект). Выберите в качестве шаблона SQL Server Scripts (Сценарии SQL Server). Этот шаблон используется потому, что SQL Server Management Studio не включает шаблонов проектов для служб Notification Services. Дайте проекту имя SQL2005StepByStep_NS. Выберите папку. Снимите флажок Create Directory For Solution (Создать каталог для решения). Нажмите кнопку ОК, чтобы создать проект.
  • Через Проводник Windows скопируйте из папки My Documents\MicrosoftPress\SQLAppliedTechSBS\Chapter13 в папку, в которой вы сохраняете проект, следующие файлы:
  • EmptyADF.xml
  • SQL2005StepByStepICF.xml
  • BirdingTransform.xslt (Этот файл не понадобится до окончательной обработки, просто добавьте его сейчас для удобства.)
  • В окне Solution Explorer (Обозреватель решений) щелкните правой кнопкой мыши SQL2005StepByStep_NS и выберите из контекстного меню команду Add Existing Item (Добавить существующий элемент). В диалоговом окне Add Existing Item (Добавление существующего элемента) выберите из раскрывающегося списка Files of Type (Типы файлов) All Files (Все файлы). Добавьте перечисленные выше два файла в проект. Оба файла будут помещены в папку Miscellaneous, как показано на рисунке:
  • Щелкните правой кнопкой мыши файл EmptyADF.xml и выберите из контекстного меню команду Rename (Переименовать). Измените имя файла на BirdingADF.xml.
  • В Проводнике Windows в папке проекта создайте новую папку с именем Notifications. В этой папке будут сохранять файлы, создаваемые в процессе доставки уведомлений.
  • Предупреждение. Кроме того, нужно выбрать учетную запись пользователя, которая будет действовать от имени экземпляра служб Notification Services. Эта учетная запись должна обладать необходимыми полномочиями на создание и изменение файлов в папках назначения.

    Основа приложения служб Notification Services

    Прежде, чем можно будет продолжить работу, требуется сделать несколько базовых определений приложения.

    Определение схем

    Файл ADF состоит из нескольких разделов, которые используются для описания схемы таблиц, содержащих информацию о событиях, подписках и уведомлениях. Как уже упоминалось ранее, файл ADF - это XML-файл, который должен соответствовать предварительно определенной схеме XSD.

    В терминах служб Notification Services, каждый отличающийся создаваемый тип элемента называется классом, например, класс событий или класс подписки. Каждый класс может содержать более одной таблицы. Классы можно даже разбивать на несколько таблиц и вновь соединять при помощи одного или более представлений, в зависимости от типа класса.

    Команды SQL, которые выполняют операции сопоставления или обновления, называются правилами, например, правило событий, правило хроники событий или запланированные правила.

    В следующих разделах мы создадим файл ADF, который будет содержать все схемы объектов, о которых здесь говорилось.

    Определяем класс событий

  • Откройте для редактирования файл BirdingADF.xml, выполнив двойной щелчок на нем в окне Solution Explorer (Обозреватель решений).
  • Просмотрите его содержание и найдите комментарии XML, которые служат указателями места заполнения для добавляемого содержимого.
  • Схема для событий должна включать следующие поля:
  • Регион
  • Дата и время наблюдения
  • Описание наблюдения
  • Категория наблюдения
  • Вместо комментария <!-- Replace with EventClasses XML --> введите или вставьте следующий фрагмент XML:

    <!- Event Classes -> 
    <EventClasses> 
      <EventClass>
        <EventClassName>SightData</EventClassName>
        <Schema> 
          <Field>
            <FieldName>RegionID</FieldName>
            <FieldType>varchar(5)</FieldType>
            <FieldTypeMods>not null</FieldTypeMods> 
          </Field> 
          <Field>
            <FieldName>Date</FieldName>
            <FieldType>datetime</FieldType>
            <FieldTypeMods>not null</FieldTypeMods> 
          </Field> 
          <Field>
            <FieldName>Observation</FieldName>
            <FieldType>nvarchar(500)</FieldType>
            <FieldTypeMods>not null</FieldTypeMods> 
          </Field> 
          <Field>
            <FieldName>Category</FieldName>
            <FieldType>char(1)</FieldType>
            <FieldTypeMods>not null</FieldTypeMods> 
          </Field> 
        </Schema> 
        <IndexSqlSchema> 
          <SqlStatement>
            CREATE INDEX myIndex
                ON SightData ( Date ); 
          </SqlStatement> 
        </IndexSqlSchema> 
      </EventClass> 
    </EventClasses>

    Обратите внимание на структуру содержимого. Она выглядит как обычное определение схемы базы данных, но выражено при помощи синтаксиса XML. Мы объявляем имя класса событий вместо имени таблицы, затем поля, типы данных, модификаторы для приема нулевых значений и т. д.

    Кроме того, при объявлении полей, которые будут формировать таблицу событий SightData, можно включить информацию об индексах, которые, по вашему мнению, полезно будет применить при обращении к таблице правила сопоставления. Таким образом, если известно, что правило сопоставления будет использовать данные столбца RegionID в качестве фильтра либо самостоятельно, либо в предложении JOIN, можно дать указание службам Notification Services создать соответствующие индексы. Это будет полезно в тех случаях, если данные поступают в больших пакетах; это не характерно для примера с Птицландией, поэтому в индексах нет необходимости. Элемент IndexSqlSchema показан просто как напоминание. Дополнительную информацию об использовании индексов для повышения производительности запросов можно найти в лекции 2 "Повышение производительности запроса".

    Дополнительная информация Для определения схем в ADF существуют дополнительные параметры. Дополнительную информацию о доступных элементах можно найти в Электронной документации по SQL Server 2005 в теме "Справочник по файлам определения приложений".

    Определение класса подписки.Введите или вставьте следующий XML-фрагмент ниже комментария <!— Subscription Classes —>:

    <!— Subscription Classes —> 
    <SubscriptionClasses> 
      <SubscriptionClass>
        <SubscriptionClassName>SightRegionSubs</SubscriptionClassName> 
        <Schema> 
          <Field> 
            <FieldName>DeviceName</FieldName> 
            <FieldType>nvarchar(255)</FieldType> 
            <FieldTypeMods>not null</FieldTypeMods> 
          </Field> 
          <Field>
            <FieldName>SubscriberLocale</FieldName> 
            <FieldType>nvarchar(10)</FieldType> 
            <FieldTypeMods>not null</FieldTypeMods> 
          </Field> 
          <Field>
            <FieldName>RegionID</FieldName> 
            <FieldType>varchar(5)</FieldType> 
            <FieldTypeMods>not null</FieldTypeMods> 
          </Field> 
        </Schema> 
        <EventRules> 
          <EventRule>
            <RuleName>SightRegionEventRule</RuleName>
            <EventClassName>SightData</EventClassName> 
            <Action>
              INSERT INTO SightAlerts(SubscriberId, DeviceName, SubscriberLocale, 
                 Region, Date, Observation, Category) 
              SELECT s.SubscriberId, s.DeviceName, s.SubscriberLocale,
                     e.RegionID, e.Date, e.Observation, e.Category 
                 FROM SightData e, SightRegionSubs s 
                 WHERE e.RegionID = s.RegionID; 
            </Action> 
          </EventRule> 
        </EventRules> 
      </SubscriptionClass> 
    </SubscriptionClasses>

    Объявление схем подписки аналогично объявлению классов событий в предыдущем разделе. Как и в предыдущем случае, мы указываем вместо имени таблицы имя класса подписки, затем имена полей и т. д.

    Определение подписки включает один важный объект: правило сопоставления событий. В правиле после класса событий указывается имя, к которому оно относится, а затем инструкция T-SQL, которая задает действующее правило.

    Для понимания этого правила нам придется немного забежать вперед. Задача инструкции RULE – вставка записей в таблицу, или класс, уведомлений, который мы еще не определили. Следовательно, ни имя таблицы назначения, ни поля, которые она содержит, нам не известны. Они будут определены ниже при определении класса уведомлений.

    Инструкция RULE собирает необходимые столбцы из двух исходных классов: класса событий и класса подписки, а также, что еще более важно, включает ключ для понимания отношения между этими двумя классами. В приведенном выше коде правило сопоставления сопоставляет идентификатор RegionID из класса событий идентификатору RegionID из класса подписки. Таким образом, подписчики получат уведомления, когда будет выполнено наблюдение в регионе, хранящемся в записи о подписке каждого подписчика.

    Определение класса уведомлений.Введите или вставьте следующий XML-фрагмент ниже комментария <!— Notification Classes —>:

    <!— Notification Classes —> 
      <NotificationClasses> 
        <NotificationClass>
          <NotificationClassName> SightAlerts </NotificationClassName> 
          <Schema> 
            <Fields> 
              <Field>
                <FieldName>Region</FieldName> 
                <FieldType>nvarchar(35)</FieldType> 
              </Field> 
              <Field>
                <FieldName>Date</FieldName> 
                <FieldType>datetime</FieldType> 
              </Field> 
              <Field>
                <FieldName>Observation</FieldName> 
                <FieldType>nvarchar(500)</FieldType> 
              </Field> 
              <Field>
                <FieldName>Category</FieldName> 
                <FieldType>char(1)</FieldType> 
              </Field> 
            </Fields> 
          </Schema> 
          <ContentFormatter>
            <ClassName>XsltFormatter</ClassName> 
            <Arguments> 
              <Argument>
                <Name>XsltBaseDirectoryPath</Name> 
                <Value>%_AppPath_%</Value> 
              </Argument> 
              <Argument>
                <Name>XsltFileName</Name> 
                <Value>BirdingTransform.xslt</Value> 
              </Argument> 
            </Arguments> 
          </ContentFormatter> 
          <Protocols> 
            <Protocol>
              <ProtocolName>File</ProtocolName> 
            </Protocol> 
          </Protocols> 
        </NotificationClass> 
      </NotificationClasses>

    Здесь содержимое схемы класса уведомлений также достаточно понятно, но содержит кое-что неожиданное. В данном случае схеме сопутствует элемент ContentFormatter. Элемент ContentFormatter указывает, какой компонент будет отвечать за формирование уведомления в окончательном виде. Подробнее об этом элементе будет рассказано ниже в разделе "Как скомпоновать сообщение уведомления?"

    Определение поставщиков.Введите или вставьте следующий XML-фрагмент ниже комментария <!— Replace with Providers —>:

    <!- Providers XML -> 
    <Providers>
      <NonHostedProvider>
        <ProviderName>BirdingSPEventProvider</ProviderName>
      </NonHostedProvider> 
    </Providers>

    Этот XML-фрагмент показывает, что поступит по маршруту, который находится не под управлением служб Notification Services. Нажмите кнопку Save (Сохранить) на панели инструментов, чтобы сохранить файл BirdingADF.xml, не потеряв изменений.

    Изменяем конфигурацию экземпляра

    На следующем этапе необходимо отредактировать ICF-файл. Этот файл представляет собой исходную точку, через которую службы Notification Services будут выполнять синтаксический анализ конфигурационных файлов и осуществлять все необходимые действия. Следовательно, он содержит некоторую основную информацию и данные, специфичные для экземпляра.

    Откройте для редактирования файл SQL2005StepByStepICF.xml, выполнив двойной щелчок на файле в окне Solution Explorer (Обозреватель решений). Нужно будет изменить его содержимое так, чтобы оно соответствовало действующей конфигурации компьютера.

  • В начале ICF-файла определяются параметры, которые будут использоваться в различных частях этого файла. Параметры _ DBEngineInstance_ и _ServerName_ будут использоваться многократно при определении ядра базы данных и сервера, поддерживающего экземпляр служб Notification Services. Если ваша конфигурация не отличается от указанной, оставьте значения без изменения.
  • Параметр _InstancePath_ показывает, в какой папке службы Notification Services будут искать файлы ICF. Измените его значение так, чтобы он указывал на папку, в которой мы сохранили проект служб Notification Services.
  • Обратите внимание на значение элемента InstanceName, которое в данном примере равно SQL2005StepByStep.
  • SqlServerSystem - это используемый сервер. Обратите внимание на то, что он просто уточняет параметр, определенный выше.
  • Элемент Applications содержит список и детали всех приложений, которые зависят от определяемого экземпляра.
  • Каждый элемент Application содержит имя приложения, каталог, в котором размещен соответствующий файл ADF, и имя ADF-файла. Обратите внимание на то, что текущий файл использует параметры, которые определены в начале этого файла.
  • Элемент DeliveryChannels объявляет доступные каналы и их свойства. В данном сценарии для облегчения восприятия указан только один канал file. Этот канал file требует аргумента в виде физического пути к файлу. Измените путь так, чтобы он соответствовал размещению папки Notifications, которая была создана в действии 6 ранее описанной процедуры "Создаем проект и решение SQL Server 2005 Management Studio"..Предупреждение. Не забудьте отредактировать параметр _InstancePath_ и аргумент FileName канала доставки, чтобы они соответствовали путям к файлам в вашей системе. Если вы этого не сделаете, экземпляр служб Notification Services не будет функционировать должным образом.

    Нажмите кнопку Save (Сохранить), чтобы сохранить файл ICF и не потерять изменения.

    Дополнительная информация Для определения объектов в файле ICF можно указать дополнительные параметры. Информацию о доступных элементах можно найти в Электронной документации по SQL Server 2005 в теме "Справочник по файлам определения экземпляра".
  • Первоначальное развертывание

    Чтобы развернуть и активизировать приложение уведомлений, требуется выполнить определенные действия. Этим действиям следует уделить особое внимание, потому что прежде чем экземпляр служб Notification Services начнет работать, он должен пройти несколько состояний. Если вы хотите, чтобы решение работало, нужно понимать суть выполняемых действий. Вот краткое описание процесса:

  • Создайте экземпляр в соответствии с параметрами, хранящимися в файле ICF. На этом этапе создаются все объекты инфраструктуры.
  • Зарегистрируйте экземпляр в операционной системе. На этом этапе выполняется конфигурация службы Windows, обработка пользователей и т. п.
  • Включите экземпляр, чтобы он мог получать запросы и события. Это действие эквивалентно запуску приложения, хотя включение создает состояние без обработки, аналогичное паузе.
  • Запустите экземпляр или службу Windows, ассоциированную с этим экземпляром. Это позволит приложению получать извещения о событиях внешнего мира и генерировать уведомления для доставки.
  • В завершение, выполните еще одно действие - обновление экземпляра. Это следует делать при каждом изменении конфигурации приложения.
  • Создаем экземпляр

    Чтобы создать новый экземпляр служб Notification Services (решение), выполните следующие действия:

  • Откройте SQL Server Management Studio и установите соединение с сервером базы данных.
  • В окне Object Explorer (Обозревателя объектов) щелкните правой кнопкой мыши узел Notification Services и выберите из контекстного меню команду New Notification Services Instance (Создать экземпляр служб Notification Services), как показано ниже.
  • Откроется окно New Notification Services Instance (Создание экземпляра служб Notification Services). Укажите путь к только что созданному файлу ICF (можно ввести его в строке ввода, вставить через буфер обмена или нажать кнопку Browse (Обзор) и выбрать файл).
  • Службы Notification Services выполнят синтаксический анализ файла ICF, чтобы извлечь параметры, которые в нем содержатся. Найденные параметры появятся в секции Parameters (Параметры) диалогового окна. Проверьте, все ли правильно. Параметры, которые отображаются на следующем рисунке – это частный случай; в вашем диалоговом окне будут отображаться другие папки и другое имя компьютера.
  • При нажатии кнопки ОК службы Notification Services приступают к обработке содержание файла ICF. Окно выполнения задания Creating New Notification Services Instance (Создание нового экземпляра служб Notification Services), показанное на следующем рисунке, отображает каждый этап и уведомляет пользователя об успехе или неудаче установки.
  • Если экземпляр был успешно создан, нажмите кнопку Close (Закрыть), чтобы закрыть окно выполнения задания. В противном случае прочитайте сообщение об ошибке и выполните соответствующие настройки, чтобы исправить данные ошибки. После исправления ошибок, повторите действия 2-5.
  • В SQL Server Management Studio изучите информацию в окне Object Explorer (Обозреватель объектов). Вы должны обратить внимание на некоторые новые элементы, появившиеся в этом окне (они показаны на следующем рисунке).
  • Новый экземпляр в дереве узла Службы Notification Services с именем SQL2005StepByStep.
  • Две новых базы данных в дереве узла Databases (Базы данных) с именами SQL2005StepByStepNSMain и SQL2005StepByStepBirding. При внимательном рассмотрении вы увидите, как много объектов (таблиц, представлений и хранимых процедур) для вас создают и обслуживают службы Notification Services.
  • Регистрируем экземпляр

    При помощи следующих действий мы сгенерируем службу Windows, которая будет ожидать входящих событий или запросов для экземпляра служб Notification Services.

  • В SQL Server Management Studio разверните дерево узла Службы Notification Services в обозревателе Object Explorer (Обозреватель объектов). Щелкните правой кнопкой мыши на экземпляре SQL2005StepByStep и выберите из контекстного меню команды Task, Register (Задачи, Зарегистрировать).
  • В диалоговом окне Register Instance (Регистрация экземпляра), которое показано на следующем рисунке, установите флажок Create Windows Server (Создать службу Windows) и укажите учетные данные соответствующей учетной записи, которая будет использоваться для запуска этой службы. Если учетные данные не будут указаны, то служба запустится под встроенной учетной записью Network Service, которая обладает небольшими полномочиями. В качестве альтернативы можно отредактировать службу напрямую и изменить входную учетную запись на LocalSystem или какую-либо другую. Однако рекомендуется использовать учетную запись домена, потому что в этом случае можно изолировать определенные разрешения, предоставляемые учетной записи, вместо того, чтобы изменять разрешения встроенной учетной записи. После ввода всех параметров нажмите кнопку ОК для регистрации экземпляра.Дополнительная информация Чтобы найти дополнительную информацию об учетных записях и безопасности в службах Notification Services, ознакомьтесь с темой "Настройка учетных записей Windows для экземпляра служб Notification Services" в Электронной документации по SQL Server 2005.
  • И снова диалоговое окно хода выполнения задания уведомит об успешном или неуспешном завершении процесса регистрации. В случае неудачи проблема, вероятнее всего, кроется в некорректных разрешениях. Проверьте настройки и повторите попытку регистрации. После того, как экземпляр будет успешно зарегистрирован, можно убедиться, что служба Windows существует в инструменте администрирования Services (Службы). Эта служба зарегистрирована под именем NS$SQL2005StepByStep. Инструмент Services (Службы) можно найти, выбрав из меню Start (Пуск) команды Control Panel, Administrative Tools, Services (Панель управления, Администрирование, Службы).
  • Хотя экземпляр служб Notification Services уже создан, он все еще не может обслуживать запросы. Чтобы он начал выполнять свои функции, необходимо включить и запустить экземпляр.

    Включаем экземпляр

  • В SQL Server Management Studio разверните дерево узла Службы Notification Services в обозревателе Object Explorer (Обозреватель объектов). Щелкните правой кнопкой мыши экземпляр и выберите из контекстного меню команду Enable (Включить).
  • В открывшемся диалоговом окне Enable Instance Confirmation (Подтверждение включения экземпляра) вам будет предложено внимательно проверить команду. Нажмите кнопку Yes (Да), чтобы включить экземпляр.
  • Запускаем экземпляр

  • Щелкните правой кнопкой мыши имя экземпляра в окне Object Explorer (Обозревателя объектов) и выберите из контекстного меню команду Start (Запустить).
  • В открывшемся диалоговом окне Start Instance Confirmation (Подтверждение запуска экземпляра) вам будет предложено внимательно проверить команду. Нажмите кнопку Yes (Да), чтобы запустить экземпляр.
  • Проверка состояния экземпляра

    К этому моменту все готово к бесперебойной работе. Можно просмотреть свойства экземпляра, чтобы убедиться в том, что все компоненты включены и/или запущены. Чтобы открыть диалоговое окно Instance Properties (Свойства экземпляра), показанное на следующем рисунке, щелкните правой кнопкой имя экземпляра и выберите из контекстного меню команду Properties (Свойства) (Чтобы убедиться в том, что запустились службы, перейдите на страницу Windows Services (Службы Windows)).

    Чтобы протестировать приложение, необходимо запустить событие и проверить, будет ли доставлено соответствующее уведомление.

    Обновление и модернизация экземпляра

    При каждом изменении содержимого файла ADF рабочий экземпляр приложения служб Notification Services необходимо обновить, чтобы вступили в действие сделанные изменения.

    Так же, как при настройке работы экземпляра, при обновлении следует всегда следовать одной и той же процедуре. Обновление - это процесс, обратный установке.

    Для обновления экземпляра выполните следующие действия.

  • Щелкните правой кнопкой мыши экземпляр в Object Explorer (Обозревателе объектов) и выберите из контекстного меню команду Stop (Остановить). Нажмите кнопку Yes (Да) в диалоговом окне Stop Instance Confirmation (Подтверждение остановки экземпляра).
  • Отключите экземпляр, щелкнув на нем правой кнопкой мыши и выбрав из контекстного меню команду Disable (Отключить). Нажмите кнопку Yes (Да) в диалоговом окне Disable Instance Confirmation (Подтверждение отключения экземпляра).
  • Запустите процесс обновления, щелкнув правой кнопкой имя экземпляра и выбрав из контекстного меню команды Task, Update (Задачи, Обновить).
  • Откроется диалоговое окно Update Instance (Обновление экземпляра). Укажите ICF-файл, как при первой настройке экземпляра. Затем нажмите кнопку ОК.
  • На экран будет выведено новое окно выполнения задания, которое показано на следующем рисунке.
  • Первый этап процесса заключается в сравнении обновленного ADF-файла с существующими данными экземпляра и приложения для выявления сделанных изменений. После изучения файлов процесс выносит заключение в диалоговом окне Update Summary (Сводная информация обновления), как показано на следующем рисунке.
  • Если все правильно, подтвердите предлагаемые изменения, щелкнув на кнопке Update (Обновить). Процесс попытается применить изменения к базе данных. В конце концов процесс либо успешно завершится, либо будет остановлен, если произойдет ошибка. На следующем рисунке показано диалоговое окно Updating Instance (Обновление экземпляра) с сообщением об ошибке. Можно щелкнуть это сообщение, чтобы просмотреть подробную информацию или задержать над ней указатель мыши, чтобы получить подсказку о содержании ошибки.
  • Если процесс завершился неудачей вследствие ошибки, исправьте ошибку и снова попытайтесь запустить процесс. После успешного завершения перезапустите экземпляр, включив и запустив его еще раз.
  • Запуск приложения

    К этому моменту мы создали приложение и должны проверить, как оно работает. Для этого мы воспользуемся несколькими простыми сценариями (системными и SQL Server) и выполним действия, описанные в следующих разделах.

    Добавление подписчиков, устройств и подписок в приложение

    В реальном мире мы использовали бы приложение для сбора необходимой информации о подписчиках, выбранных ими устройствах и подписках, которые им интересны. Характер приложения для управления подпиской может быть различным. Можно написать интерфейс, предназначенный специально для процесса управления подписками. В других случаях подписки создаются в результате действий какого-либо другого приложения. Например, если вы создаете решение для обработки информации о клиентах и заказов на книги через интернет, то при установке флажка "Я интересуюсь другими книгами этого автора" в фоновом режиме должна быть сформирована подписка.

    Дополнительная информация Дополнительную информацию о процессе подписки можно найти в теме "Разработка интерфейсов управления подпиской".

    Чтобы добавить подписчиков, в нашем примере мы используем несколько файлов VBScript. В реальной системе при использовании API Служб Notification Services выполняется точно такая же операция, как при использовании следующего сценария.

    Добавляем подписчиков и подписки

  • Через Проводник Windows скопируйте из папки My Documents\MicrosoftPress\SQLAppliedTechSBS\Chapter13 в папку, в которой вы сохраняете проект, следующие файлы:
  • AddSubscribers.vbs
  • AddSubscriptions.vbs
  • ViewSubscribersAndDevices.sql
  • ViewSubscriptions.sql
  • В SQL Server Management Studio щелкните правой кнопкой мыши SQL2005StepByStep в окне Solution Explorer (Обозреватель решений). Выберите из контекстного меню команды Add, Existing Item (Добавить, Существующий элемент). Добавьте перечисленные выше четыре файла в проект. Файлы .vbs будут помещены в папку Miscellaneous, а файлы .sql - в папку Queries.
  • Откройте файл AddSubscribers.vbs для просмотра, выполнив на нем двойной щелчок в окне Solution Explorer (Обозревателя решений).
  • В окне Visual Studio IDE невозможно запустить файл сценария VBScript. Поэтому вернитесь в окно Windows Explorer (Проводника Windows), выделите файл
  • Если что-либо пойдет не так, то на экран будет выведено диалоговое окно ошибки, аналогичное окну, показанному на следующем рисунке. Исправьте ошибку и еще раз запустите сценарий.
  • Повторите действие 4 для файла AddSubscriptions.vbs.
  • Вернитесь в окно SQL Server Management Studio, откройте файл запроса ViewSubscribersAndDevices.sql и запустите его. Если в окне результатов отображаются сведения о подписчиках, то сценарий работает правильно. Обратите внимание, что запрос обращен к представлению, а не к таблице.
  • Откройте файл запроса ViewSubscriptions.sql и выполните его. Если в окне результатов отображаются сведения о подписке, то сценарий работает правильно.
  • Передача событий приложению

    Обычно для передачи событий приложению используется один из стандартных поставщиков событий. Вы можете передавать события через модель объекта Event (API объекта событий), упакованными в XML-файлы (XML API), или через предоставляемые хранимые процедуры (API SQL Server).

    Дополнительная информация Дополнительную информацию о событиях можно найти в теме "Определение поставщиков событий" Электронной документации по SQL Server 2005.

    В нашем примере мы воспользуемся двумя простыми сценариями SQL, которые используют хранимые процедуры API SQL Server.

  • Через Проводник Windows скопируйте из папки My Documents\MicrosoftPress\SQLAppliedTechSBS\Chapter13 в папку, в которой вы сохраняете проект, следующие файлы:
  • AddSightEvents.sql
  • ViewSightEvents.sql
  • В SQL Server Management Studio щелкните правой кнопкой мыши SQL2005StepByStep в окне Solution Explorer (Обозреватель решений). Выберите из контекстного меню команды Add, Existing Item (Добавить, Существующий элемент). Добавьте эти два файла в проект. Они будут помещены в папку Queries.
  • Откройте файл AddSightEvents.sql для просмотра, выполнив на нем двойной щелчок в окне Solution Explorer (Обозревателя решений). Обратите внимание на то, что события были добавлены при помощи двух хранимых процедур с именами NSEventBeginBatchSightData и NSEventWriteSightData. Первая хранимая процедура запускает пакет событий, а вторая добавляет определенные события. Когда пакет событий завершается, сценарий выполняет хранимую процедуру NSEventFlushBatchSightData, чтобы сообщить службам Notification Services о том, что пакет готов для обработки. Службы Notification Services обрабатывают события пакетом для повышения производительности. Если вы не можете передать пакет, то службы Notification Services могут запуститься, когда события все еще передаются приложению, тем самым снижается эффективность широковещательной рассылки уведомлений и набора функций.
  • Выполните сценарий: Он возвратит идентификатор пакета событий EventBatchID и количество событий, полученных приложением. Запишите идентификатор EventBatchID, он понадобится в следующем действии. Если вы в первый раз выполняете этот сценарий, идентификатор EventBatchID будет иметь значение 1. При каждом последующем выполнении значение идентификатора EventBatchID будет увеличиваться.
  • Чтобы проверить события в системе, откройте сценарий ViewSightEvents. Просмотрите его и измените значение параметра @EventBatchId так, чтобы оно соответствовало идентификатору EventBatchId, который был возвращен в предыдущем действии.
  • Выполните сценарий: Он возвратит сведения об EventBatch и информацию о событии.
  • Определение подписчиков, которым следует отправить уведомления

    Пока мы наблюдали за событиями, система проверила, существует ли событие, и запустила генерацию уведомления. Службы Notification Services периодически проверяют наличие новых событий и выполняют правило события, которое содержится в ADF-файле, в классе подписки. Правило события выполняет вставку записи в таблицу уведомлений. В данном примере таблица уведомлений - это таблица SightAlerts. Мы видим, что имя таблицы уведомлений совпадает с именем класса уведомлений, определенного в ADF.

    Можно проверить, какие уведомления предположительно будут переданы, выполнив следующие действия.

    Проверяем уведомления

  • Через Проводник Windows скопируйте из папки My Documents\MicrosoftPress\SQLAppliedTechSBS\Chapter13 в папку, в которой вы сохраняете проект, следующий файл:
  • ViewNotifications.sql
  • В SQL Server Management Studio щелкните правой кнопкой мыши SQL2005StepByStep в окне Solution Explorer (Обозреватель решений). Выберите из контекстного меню команды Add, Existing Item (Добавить, Существующий элемент). Добавьте этот файл в проект. Файл будет помещен в папку Queries.
  • Откройте и запустите сценарий ViewNotifications.sql. В панели Results (Результаты) отобразится состояние уведомлений.Предупреждение. Распространитель (описанный в следующем разделе) выполняется по собственному расписанию, следовательно, на отображение результатов может потребоваться некоторое время. Возвращайтесь к запросу каждые несколько секунд, пока он не возвратит успешное или неудачное состояние доставки для каждого уведомления в очереди.
  • Компоновка сообщения уведомления

    После того, как правило события сгенерирует соответствующие записи в таблице уведомлений, в действие вступает еще один процесс, который называется распространителем. Распространитель выполняет две задачи: формирование окончательного форматированного готового к доставке уведомления и передача этого форматированного содержимого действующим модулям доставки. Распространитель использует компонент форматирования содержимого для первой из этих двух задач, а для второй задачи вызывает внешние для решения серверы.

    Окончательная форма уведомления формулируется в ADF/ICF. Как мы видели при создании файла ADF, в конце определения класса уведомлений объявляется соответствующий модуль форматирования содержимого. Атрибуты модуля форматирования содержимого определяют имя модуля форматирования и обязательные аргументы. Модуль форматирования XsltFormatter - это один из стандартных модулей, который, кроме указания трех аргументов, о которых рассказывается далее в этом разделе, не требует настройки. Другие модули форматирования требуют полного уточненного имени и дополнительной информации, которая позволяет службам Notification Services найти и использовать их.

    Стандартный модуль форматирования XsltFormatter использует три аргумента:

  • Каталог размещения файлов XSLT. Он соответствует аргументу XsltBaseDirectoryPath.
  • Действующее имя применяемого файла XSLT. Оно соответствует аргументу XsltFileName.
  • По желанию можно указать модулю форматирования содержимого, что данные, содержащиеся в таблице уведомлений, уже имеют формат XML или HTML и не нуждаются в дальнейшей кодировке содержимого. Вы можете воспользоваться этой функцией, указав аргумент DisableEscaping. Значение по умолчанию для этого аргумента равно false.
  • Дополнительная информация Дополнительную информацию о модулях форматирования содержимого можно найти в теме "Настройка модулей форматирования данных" в Электронной документации по SQL Server 2005.

    В нашем примере аргументы, перечисленные выше, соответствуют переменной _AppPath_ для пути к основному каталогу и файлу BirdingTransform.xslt для имени файла XSLT.

    Обратите внимание на то, что под записью модуля форматирования содержимого находится запись протокола. Эта запись указывает на определение протокола в ICF.

    Просмотрев файл ICF, найдите элемент DeliveryChannel в конце файла. Этот элемент включает элемент ProtocolName, аргумент которого указывает на файл HTML в папке Notifications, которую мы создали в начале этой лекции.

    Итак, Распространитель проверяет представления таблицы уведомлений. Здесь он находит информацию об идентификаторе подписчика ( SubscriberID ), канале доставки ( DeliveryChannel ), языковому стандарту подписчика ( SubscriberLocale ), имени устройства ( DeviceName ) и адресе устройства ( DeviceAddress ). С помощью этой информации он может вызвать модуль форматирования, чтобы сформировать "сообщения" уведомлений и скомпоновать вывод для доставки.

    Доставка уведомлений

    Если в качестве канала доставки используется файл, то процесс завершается после того, как файл будет сгенерирован, дальнейшее распространение не требуется.

    Вы можете проверить результаты нашего примера, просмотрев их в папке Notification, которую мы создали в папке проекта при настройке инфраструктуры. Здесь вы найдете файл с именем SightNotifications.htm, который должен содержать форматированное уведомление в виде строки.

    Предупреждение. Если файл SightNotifications.htm окажется пустым, убедитесь, что файл BirdingTransform.xslt находится в каталоге проекта в соответствии с инструкциями, которые были даны ранее в этой лекции.

    Доставка в реальном мире, вероятнее всего, будет гораздо более сложной. Подробное рассмотрение настройки конфигурации сервера в данной книге не предполагается. Однако пример, который мы использовали, обеспечивает хорошую исходную точку для понимания принципов работы служб Notification Services.

    Заключение

    В этой лекции рассказывалось об основах настройки и использования приложений уведомлений при помощи компонента SQL Server 2005 Службы Notification Services.

    Вы можете продолжить разработку примера, представленного в этой лекции, и добавить режим обработки архивных данных, дополнительные каналы доставки и функции многоязыковой поддержки.

    SQL Server – мощная платформа для установки базы данных, которая не только предоставляет базовые функции хранения и извлечения данных. Мы наблюдали, как SQL Server 2005 обеспечивает безопасность, защиту, передачу и сводные данные. Мы также видели, как SQL Server организует и хранит данные, при этом у читателя сложилось определенное понимание принципов оптимизации извлечения данных путем изменения внутренней структуры хранения. Вы научились использовать удаленные источники данных, осуществлять доступ к SQL Server через интернет, а также разрешать пользователям безопасно создавать свои запросы через интерфейс созданных вами приложений. Вы узнали, как использовать транзакции для защиты пользовательских данных и как хранить архивные данные, чтобы можно было выполнить откат отдельных транзакций. Кроме того, теперь вы знаете, как использовать эффективные инструменты SQL Server 2005 для работы с отчетами и уведомлениями. То есть, у вас теперь есть все, что нужно для того, чтобы начать более эффективно использовать установку SQL Server 2005 - это немного практики и вся необходимая информация, которую вы легко найдете в этой книге.

    Краткий справочник по 9 лекции

    Чтобы Выполните следующие действия
    Создать новый проект для служб Notification Services Создайте специальную базу данных приложения, затем в SQL Server Management Studio выберите из меню File (Файл) команды New, Project (Создать, Проект) и далее выберите в качестве шаблона проекта SQL Server Scripts (Сценарии SQL Server). Добавьте файлы ADF и ICF.
    Создать основу приложения служб Notification Services Определите классы событий, подписок, уведомлений и поставщиков.
    Развернуть приложение служб Notification Services Создайте, зарегистрируйте, включите и запустите экземпляр служб Notification Services.
    Создать экземпляр служб Notification Services В Object Explorer (Обозревателе объектов) в SQL Server Management Studio щелкните правой кнопкой мыши узел Службы Notification Services и выберите из контекстного меню New Notification Services Instance (Новый экземпляр служб Notification Services).
    Зарегистрировать экземпляр служб Notification Services В Object Explorer (Обозревателе объектов) в SQL Server Management Studio разверните узел Службы Notification Services, щелкните правой кнопкой мыши экземпляр и выберите из контекстного меню команды Task, Register (Задачи, Зарегистрировать).
    Включить экземпляр служб Notification Services В Object Explorer (Обозревателе объектов) в SQL Server Management Studio разверните узел Службы Notification Services, щелкните правой кнопкой мыши экземпляр и выберите из контекстного меню команду Enable (Включить). Запустить экземпляр В Object Explorer (Обозревателе объектов) в SQL служб Notification Server Management Studio разверните узел Services Службы Notification Services, щелкните правой кнопкой мыши экземпляр и выберите из контекстного меню команду Start (Запустить).
    Обновить экземпляр служб Notification Services Остановите и отключите экземпляр; затем в Object Explorer (Обозревателе объектов) в SQL Server Management Studio разверните узел Службы Notification Services, щелкните правой кнопкой мыши экземпляр и выберите из контекстного меню команду Update (Обновить).
    Страницы:

    В предыдущей лекции вы научились использовать службы Reporting Services, предоставляемые SQL Server. В данной лекции речь пойдет о службах Notification Services, еще одном компоненте SQL Server. Службы Notification Services - мощный компонент SQL Server, который позволяет разработчикам быстро спроектировать, реализовать и развернуть масштабируемое приложение уведомлений. Эти задачи решаются посредством значительной автоматизации двух основных элементов: автоматизации всех процессов, вовлеченных в выполнение решения, и автоматизации создания и управления объектами базы данных и приложения.

    Такая автоматизация обеспечивает выигрыш в производительности, но требует, чтобы процесс проектирования отвечал принципу, который службы Notification Services используют для работы с уведомлениями. Это означает, что нужно понимать терминологию, архитектуру и механику платформы. Начальная кривая обучения может показаться непреодолимой, поэтому в данной лекции будет продемонстрировано, как применить принципы служб Notification Services к развитию событий в реальном мире.

    Сценарий для служб Notification Services

    Птицландия - воображаемая страна, которая имеет давние традиции в области птицеведения. Птицеведение занимается наблюдением за жизнью птиц в реальных условиях, сбором информации о том, когда птицы прилетают и улетают, выводят птенцов, сколько птиц насчитывается в данной местности и т. д. Птицеведы обычно любят делиться информацией о том, каких птиц, когда и где они наблюдали.

    Вы получили запрос на создание приложения уведомлений на заказ. Ваш клиент – Национальное орнитологическое общество Птицландии; ему необходимо уведомлять своих членов о наблюдениях за птицами по всей стране. Заинтересованные люди должны иметь возможность выбрать уведомление о наблюдениях в определенном регионе или в нескольких регионах страны.

    Определение требований

    Имея под рукой данный сценарий, вы начинаете разрабатывать черновую схему базы данных. Конечно, в реальном мире до того, как перейти к разработке базы данных, вы займетесь списком требований, разработкой схем UML (Unified Modeling Language, универсального языка моделирования) и другими элементами, но для облегчения восприятия материала в данной лекции мы немного сократим этот процесс.

    Предварительные требования

    Вероятнее всего, схема включает объекты, показанные в табл. 9.1. Имеет смысл попытаться разработать такое приложение, которое можно было бы использовать повторно в других ситуациях, не имеющих отношения к птицеведению. Следовательно, мы назовем общие объекты родовыми именами, что позволит использовать их повторно, не переписывая общие элементы.

    Объекты схемы птицеведческого приложения
    ОбъектИмя
    Список регионов Region
    Список наблюдений Events
    Список заинтересованных людей Subscribers
    Список регионов, сведения о которых интересуют данное лицо Subscriptions

    Получается, что три последних имени совпадают с терминами служб Notification Services. Но первый объект, Regions, содержит специфическую для приложения информацию и не совпадает ни с одним из терминов служб Notifications Services.

    Дополнительные требования

    Наблюдения за птицами делятся на три категории:

  • Наблюдения за обычным расселением птиц в регионе, которые можно вести в течение всего года
  • Наблюдения за прилетом в регион перелетных птиц
  • Наблюдения за редкими птицами Редкие птицы могут останавливаться в регионе на непродолжительное время, а затем не появляться в нем несколько лет. Следовательно, некоторые птицеведы были бы очень заинтересованы в информации об их появлении.
  • Таким образом, наше приложение должно отвечать следующим требованиям:

  • Подписчики должны иметь возможность подписаться на немедленные уведомления о наблюдениях редких птиц и/или уведомления по регулярному расписанию о не столь срочных событиях.
  • Подписчики должны иметь возможность получить уведомления на выбранное ими устройство. Особенно заинтересованные птицеведы хотели бы получать особые уведомления в виде SMS (коротких текстовых сообщений) на свои мобильные телефоны. Остальные подписчики, возможно, предпочли бы ежедневные или еженедельные уведомления по электронной почте.
  • Эти два требования вызывают необходимость некоторых изменений в схеме приложения. Нам придется отслеживать следующие моменты:

  • Предпочитаемое устройство назначения для каждого подписчика.Информация об устройстве включает адрес электронной почты, номер мобильного телефона и т. п.
  • Какая подписка какому устройству соответствует.Например, срочные уведомления должны отсылаться на мобильный телефон, а периодические - по электронной почте.
  • Периодичность уведомлений.Периодичность может выражаться значениями немедленно, ежедневно или еженедельно.
  • Категория наблюдений.Для данного примера мы выделим три категории: обычные, перелетные, редкие.
  • Какие уведомления по какой подписке следует отправлять.Необходимо хранить дату и время наступления события, а также дату и время передачи информации приложению. Получив эту информацию, приложение уведомлений должно определить, например, какие события были отправлены по ежедневной подписке, а какие из них пока не были отправлены по еженедельной подписке.
  • Как обеспечить соответствие этим требованиям?

  • Сведения об устройствах подписчиков должны храниться вместе с информацией о подписчиках.
  • Информация о том, какое устройство какой подписке соответствует, должна храниться вместе с информацией о подписке.
  • Информация о времени должна храниться вместе с информацией о подписке.
  • Информация о категории должна храниться вместе с событием, причем это значение должно быть предоставлено лицом, наблюдавшим событие. Таким образом, если кто-либо вводит информацию о наблюдении в решение для уведомления, он обязан указать категорию - обычные птицы, перелетные птицы или редкие птицы.
  • Архивная информация

    Управлять архивной информацией несколько сложнее. Необходимо сравнивать дату и время наступления вводимого события с датой и временем последней операции отправки уведомления. Наша схема базы данных не содержит никакой информацией о том, когда отправляются уведомления. Следовательно, нам нужно отслеживать обработку уведомлений.

    Для этого можно выбрать одну из двух моделей:

  • Запись даты и времени обработки подписки по типам. Придется записывать тип подписки (ежедневная или еженедельная) вместе с датой и временем, когда был запущен процесс отправки. При запуске процесса отправки система сохраняет текущие значения даты и времени. В результате получается только две записи: одна для еженедельных подписок и одна для ежедневных подписок.
  • Запись даты и времени обработки каждой подписки. Записывается идентификатор конкретной подписки вместе со значениями даты и времени начала обработки или идентификатор последнего события, включенного в уведомление.
  • Какую из двух моделей выбрать? Вести запись дат по типам подписки проще, чем по каждой подписке. Первый вариант требует хранения только одной записи для каждого типа подписки. Второй подход требует хранения по одной записи для каждой подписки и некоторой логики для поддержания синхронности обеих таблиц (подписок и процессов). Однако в случае, если уведомление не доставляется, подход по типам не позволит пострадавшему подписчику когда-либо получить уведомление. Этот недостаток может быть допустимым в некоторых не имеющих критической важности приложениях уведомлений, но он будет неприемлемым в другой группе приложений, например, в тех, которые связаны с ожиданием действий со стороны подписчика (необходимость обратного звонка, изменения контракта, жалобы клиента и т. д.). Действительно, даже подписчики, которые подписаны на получение уведомлений, не являющихся критически важными, предпочли бы не пропустить ни одного события. Следовательно, из соображений повторного использования и обеспечения полноты предоста вляемой информации, следует предпочесть второй вариант.

    Совет. В терминах служб Notification Services, архивные данные хранятся в таблицах хроники.

    Разнообразие устройств

    Из-за того, что наше приложение должно отправлять уведомления на различные устройства и носители, возникают некоторые дополнительные требования. Сообщения электронной почты должны доставляться при помощи сервера SMTP, а SMS-сообщения с помощью сервера текстовых сообщений. Кроме того, формат сообщений электронной почты, обычно HTML, не подходит для отправки текстовых сообщений SMS, и наоборот. Следовательно, решение должно уметь отсылать разные байты на различные типы серверов. Это проблема конфигурации, но она имеет некоторое отношение и к архитектуре приложения.

    Для реализации этих функций также существует несколько возможностей, от жесткого программирования процесса построения сообщения в приложении до использования программ сторонних разработчиков для обработки процесса преобразования. Службы Notification Services решают эту проблему с учетом открытости системы: для каждого типа устройств необходимо предоставить файл XSLT (eXtensible Stylesheet Language Transformation, преобразования расширяемого языка стилей) (для полноты нужно иметь комбинацию файла XSLT для каждого устройства и языкового стандарта). Механизм XSLT может использовать XSLT-шаблон для преобразования ввода XML в вывод других типов (HTML, XML или текст). Следовательно, это весьма подходящий способ для удовлетворения некоторых требований.

    Информация уведомления

    Внутренние процессы приложения будут управлять информацией в модуле подготовки, который не является дружественным к пользователю.

    Например, приложение ссылается на все объекты не по имени, а по числу-идентификатору. Однако, при подготовке данных для реальной доставки конечному пользователю, преобразование идентификаторов в текстовую информацию обязательно.

    Чтобы ускорить формирование окончательного уведомления для доставки, следует подготовить информацию, которая нужна этому процессу. Например, вместо хранения идентификатора региона следует хранить название региона. Кроме того, вместо идентификатора события следует хранить описание события. Таким образом, когда механизм примет решение отравить уведомление, для получения нужной информации ему не придется выполнять соединения и поиск по нескольким таблицам..Он просто прочитает запись в таблице, в которой все данные подготовлены в соответствии с его требованиями и готовы для отправки подписчику.

    Соображения производительности и масштабируемости

    Хотя наш клиент мог ничего не сказать о проблемах производительности, нам следует иметь их в виду. Сообщения электронной почты и текстовые сообщения должны доставляться подписчикам в индивидуальном порядке. Известно, что записать строку в таблицу гораздо быстрее, чем отправить сообщение по электронной почте, главным образом, вследствие сетевых задержек. В случае отсылки уведомлений большому количеству подписчиков через короткие промежутки времени может возникнуть узкое место, вследствие чего полезность приложения снизится. Необходимо предусмотреть возможные способы минимизации рабочей нагрузки процесса доставки. У нас есть две возможности ускорить время доставки:

  • Уменьшить время, отводимое на отправку каждого сообщения
  • Уменьшить количество отправляемых сообщений
  • Уменьшить время, необходимое для отправки отдельного сообщения, можно несколькими способами:

  • Использование более скоростных аппаратных устройств
  • Использование более скоростных сетевых устройств
  • Уменьшение размера сообщения
  • Какой бы способ вы не выбрали, время, которое требуется на отправку одного сообщения электронной почты или текстового сообщения, будет зависеть от характеристик сети, которые вы не можете контролировать. Следовательно, следует предпочесть уменьшение количества отправляемых сообщений. Проанализировав характер уведомлений, можно заметить, что многие подписчики разделяют интерес к данному региону, и лишь некоторые подписчики подписались на уведомления о событиях в нескольких регионах. Если это так, можно уменьшить количество отправляемых сообщений следующими способами:

  • Путем отправки одного сообщения электронной почты всем подписчикам с одинаковыми интересами. Например, все подписчики, интересующиеся Севером Птицландии, могут получать одинаковые сообщения.
  • Слить все запланированные уведомления определенного подписчика в одно уведомление, чтобы, например, подписчик, которого интересуют три соседних региона, получил бы одно уведомление вместо трех.Примечание Последние требования в разрабатываемом нами сценарии реализованы не будут. Они упомянуты здесь только для полноты описания.
  • Создание приложения

    К этому моменту мы только собрали информацию о требованиях и начали думать о том, как следует их реализовать. Мы только приступили к работе.

    Мы выбрали для разработки этого приложения службы Notification Services. Службы Notification Services помогут ускорить разработку приложения; кроме того, они предлагают платформу для вызова приложения, когда это, в конце концов, потребуется. Следовательно, нужно иметь представление о том, как наши требования преобразуются в объекты службы Notification Services, а также о процессах компоновки, развертывания и тестирования приложений Notification Services.

    В следующем разделе данной лекции приводится информация по следующим вопросам::

  • Компоненты приложений служб Notification Services
  • Преобразование требований нашего примера Птицеводство в элементы служб Notification Services.
  • Создание инфраструктуры разработки, состоящей из базы данных приложения и проекта разработки.
  • Создание основы приложения служб Notification Services
  • Выполнение первоначального развертывания
  • Дальнейшее добавление функций к приложению для удовлетворения требований
  • Компоненты приложений уведомлений

    Теперь, когда вы получили базовые знания о данных, которыми будет управлять приложение, необходимо подумать о том, как должна происходить обработка этих данных. Кроме схемы каждому приложению нужен механизм, чтобы поддерживать работу приложения и работать с данными. В составе механизма решения для уведомлений должны быть реализованы следующие компоненты.

  • Сервер SQL Server 2005.Служит для размещения базы данных (как схемы, так и данных) и компонентов служб Notification Services.
  • Подписывающее приложение.Предоставляет конечным пользователям интерфейс для ввода и редактирования информации о подписке и устройстве. В нашем примере мы не будем создавать такое приложение. Вместо этого будут использоваться особые приложения для ввода в приложение информации о подписчиках, устройствах подписчиков и данных о подписке. Иногда этот интерфейс не является собственно интерфейсом, а представляет собой триггер другого приложения, например, приложения управления клиентами или кадрами.
  • Механизм получения событий, генерируемых во внешнем мире.Службы Notification Services реагируют на события, но как они узнают о них? Службы Notification Services имеют несколько поставщиков событий, которые позволяют передавать события этим службам. Среди поставщиков событий - API объекта событий (модель объекта), Загрузчик XML и API SQL Server, предназначенный для загрузки событий при помощи хранимых процедур. Дополнительную информацию об этих поставщиках можно найти в документации служб Notification Services. В примере с Птицландией для ввода событий непосредственно в соответствующие места мы воспользуемся другим сценарием. Такие события запускают генерирование уведомления и процесс доставки.
  • Механизм сопоставления событий подпискам.Сам механизм предоставляется службами Notification Services. Однако вам придется информировать службы Notification Services о том, какие отношения имеются между событиями и подпиской, через так называемое правило сопоставления. Правило сопоставления - это обычная инструкция SQL, которая выбирает такие подписки, которые должны получать определенное событие. В нашем примере правило сопоставления сопоставляет события в определенном регионе с подписчиками, обладающими подписками на этот регион. Таким образом, если для отдельного региона наступает событие, все подписчики, имеющие подписки на этот регион, должны получить уведомления. Нужная нам инструкция SQL должна возвратить список подписок, которые соответствуют определенному региону.
  • Механизм физического формирования уведомления.После того, как приложению стало известно, какие уведомления и на какие устройства подписчиков следует отправить, необходимо скомпоновать содержимое, включающее всю необходимую текстовую информацию и форматирование. Службы Notification Services для формирования окончательного уведомления используют шаблоны XSLT. Функции Notification Services включают возможность отправки уведомлений на разных языках (в терминологии служб Notification Services они называются культурами). Если вы решили не использовать многоязычные функции, службы Notification Services все равно требуют указания культуры, которая будет использоваться в процессе работы. Этому механизму потребуются шаблоны XSLT для электронных сообщений в формате HTML и для текстовых SMS-сообщений. Необходимо указать службам Notification Services, когда и какой шаблон следует использовать.
  • Механизм доставки для реальной отправки уведомлений на индивидуальные целевые устройства.Когда информация для уведомления собрана, и шаблон XSLT подготовлен, службы Notification Services отправляют уведомление на сервер доставки или сервер, который будет выполнять окончательную доставку на устройство подписчика. Службы Notification Services предоставляют и этот механизм. Он оптимизирован в отношении производительности и масштабируемости. Информация о конфигурации, необходимая службам Notification Services для подключения к серверам доставки, а именно: имена серверов, IP-адреса и информация для аутентификации - должны быть предоставлены вами.Примечание. В нашем примере, чтобы упростить процесс настройки, мы воспользуемся каналом доставки File, а не сервером SMTP или SMS. В документации по службам Notification Services есть информация о том, как настроить канал доставки SMTP. Для SMS необходимо написать код самостоятельно или воспользоваться решением сторонних разработчиков. Хотя сначала это может показаться слишком трудным, вспомните о возможности использования веб-служб на базе служб сторонних разработчиков, а также о том, как легко можно написать клиент веб-службы в инфраструктуре .NET.
  • Как службы Notification Services ожидают наших указаний

    Как передать службам Notification Services информацию, о которой говорилось в предыдущем разделе?

    Службы Notification Services используют два конфигурационных XML-файла: конфигурационный файл экземпляра (ICF) и файл определения приложения (ADF). Файл ADF содержит большую часть параметров приложения, связанных с конфигурацией, но что представляет собой файл ICF?

    Экземпляр служб Notification Services.Службы Notification Services -это компонент, предназначенный для обслуживания нескольких приложений уведомлений на одном и том же программном и аппаратном обеспечении сервера. Это означает, что можно развернуть на одном сервере несколько приложений уведомлений. Службам Notification Services известно, что в таком случае вы с большой вероятностью будете повторно использовать информацию о подписчике и устройстве подписчика более чем в одном решении или приложении, поэтому они хранят эту информацию независимо от данных решения для уведомлений. Данные о подписчике хранятся в базе данных экземпляра, тогда как данные об устройстве подписчика размещаются в базе данных приложения. Обе базы данных получают имена в соответствии с некоторыми внутренними правилами, как вы вскоре убедитесь.

    Кроме того, службы Notification Services создают службу Windows для отслеживания всех событий, имеющих отношение к приложению, которое обслуживает экземпляр. Каждый экземпляр поддерживается уникальной веб-службой. Таким образом, экземпляр можно рассматривать как экземпляр веб-службы, управляющей несколькими приложениями служб Notification Services.

    Приложение служб Notification Services.База данных для приложения, которое мы пытаемся построить, будет хранить некоторую специфическую информацию и, хотя мы предполагаем повторное использование, понятно, что приложение уведомлений о курсе акций, приложение уведомлений о результатах футбольных матчей и приложение уведомлений о наблюдениях за птицами будут хранить различные виды данных. Следовательно, схемы, ассоциированные с каждым из этих приложений, будут отличаться в большей или меньшей степени. Задача служб Notification Services – управление данными приложения по вашему поручению; при этом для выполнения своей работы они добавляют таблицы, представления, хранимые процедуры, триггеры и любые инструменты служб Notification Services. В результате службы Notification Services запрашивают получение информации от схемы тем способом, который они могут понять и которым могут управлять самостоятельно. Это "понятный способ" в действительности представляет собой XML-файл, который привязан к оп ределенной XML-схеме (XSD). Этот файл похож на сценарий базы данных для создания таблиц, хотя он написан на XML.

    Внутренние базы данных служб Notification Services.При отсутствии других указаний, в процессе развертывания конфигурационных файлов на сервере, процесс развертывания создает как минимум две базы данных: одну для данных экземпляра, и еще по одной для каждого приложения, обслуживающего экземпляр. Имена этих баз данных должны соответствовать следующему шаблону:

  • База данных экземпляра получает имя <имя_экземпляра>NSMain. В нашем примере это имя SQL2005StepByStepNSMain.
  • База данных приложения получает имя <имя_экземпляра><имя_п-риложения>. В нашем примере это имя SQL2005StepByStepBirding.Примечание. В SQL Server 2005 можно использовать любые базы данных по вашему выбору для хранения объектов элементов служб Notification Services, относящихся как к приложению, так и к экземпляру. Notification Services генерирует и управляет многими объектами SQL Server, следовательно, необходимо указать имя схемы, где будут группироваться эти объекты.

    Поскольку количество генерируемых объектов значительно, следует использовать общие базы данных только в определенных обстоятельствах. В нашем примере общие базы данных вполне подойдут, поскольку дополнительная информация, которую мы будем использовать, не может оправдать создание отдельной базы данных. Следовательно, можно создать базу данных приложения и дать указание службам Notification Services дополнить ее своими объектами вместо того, чтобы создавать новую базу данных.

  • Требования, преобразованные в объекты служб Notification Services

    Наш контрольный список требований состоит из следующих пунктов:

  • Схема базы данных, в том числе:
  • Специфическая информация приложения, список доступных регионов.
  • События: список актуальных наблюдений за птицами по категориям.
  • Подписчики: список заинтересованных людей
  • Подписки: список регионов, интересующих определенного подписчика, желательная периодичность получения уведомлений и устройство назначения
  • Устройства подписчиков: адреса электронной почты и номера мобильных телефонов
  • Хроники: архивные данные об уведомлениях
  • Детализированные данные, готовые для уведомления
  • Сценарии для:
  • Ввода информации о подписчиках, устройствах подписчиков, сведений о подписке в приложении
  • Ввода событий
  • Инструкция SQL для правила сопоставления
  • Элементы, имеющие отношение к доставке:
  • Шаблоны XSLT для сообщений электронной почты в формате HTML и текстовых сообщений SMS
  • конфигурационная информация, необходимая для подключения к серверам доставки
  • Элементы, преобразованные в элементы служб Notification Services

    К этому моменту мы уже знаем, что приложение служб Notification Services должно включать следующие элементы:

  • Особая база данных приложения, содержащая все данные, не относящиеся к службам Notification Services:
  • Схема регионов
  • Схема типов подписок
  • Схема информации о подписчиках
  • Файл ICF, или конфигурационный файл экземпляра
  • Информация о конфигурации системы
  • Информация о конфигурации экземпляра
  • Файл ADF, или файл определения приложений, включающий:
  • Схему событий
  • Схему подписки
  • Схему уведомлений
  • Схему хроник
  • Правило сопоставления
  • Для удобства, проект разработки (SQL Server Management Studio), включающий:
  • Сценарий SQL для формирования тестовых данных
  • Файлы XSLT
  • Файлы ICF
  • Файлы ADF
  • Обратите внимание, что мы ничего не сказали о схемах подписчиков и устройствах подписчиков. Службы Notification Services будут управлять ими и диктовать свою схему. Эта предоставляемая службами схема отвечает нашим требованиям. Однако, если бы она нам не подходила, нам пришлось бы добавить в особую базу данных приложения дополнительные данные и использовать поле SubscriberID в схеме служб Notification Services в качестве логического соединения обоих источников.

    Инфраструктура разработки

    Теперь давайте приступим к созданию нашего приложения. SQL Server Management Studio не включает шаблон для проектов служб Notification Services, хотя можно создать проект для размещения файлов, имеющих отношение к службам Notification Services.

    Вместо того, чтобы начинать с нуля, воспользуемся для создания приложения уведомления по птицеводству проектом Tutorial. Это приложение даст нам сценарии, необходимые для заполнения базы данных и ввода некоторых событий.

    Установка примеров (образцов) SQL Server.Далее в материале этой лекции используется пример Tutorial, который включен в образцы к службам Notification Services. Хотя для того, чтобы изучать содержание данной лекции, примеры устанавливать необязательно, образцы к службам Notification Services, поставляемые с SQL Server 2005 помогут лучше понять службы Notification Services в целом, путем сравнения нескольких бизнес-сценариев и решений для них. Чтобы установить образцы SQL Server 2005, ознакомьтесь с темой "Установка образцов" в Электронной документации по SQL Server 2005/

    Кроме того, можно установить примеры и изучить темы Учебника по службам Notification Services в дополнение к материалам этой лекции.

    Совет. Раздел "Образцы: службы Notification Services" в Электронной документации по SQL Server 2005 включает тему, которая называется "Диагностика образцов" и может помочь вам при возникновении непредвиденных ошибок в процессе изучения действий, описанных далее в этой лекции.

    Создаем новый проект для служб Notification Services

    Хотя службы Notification Services работают со всеми элементами, имеющими отношение к уведомлениям, они не работают со специфическими данными приложения. В сценарии Птицеводство это означает, что службы Notification Services не будут обслуживать информацию о доступных регионах или категориях наблюдений.

    Аналогично, службы Notification Services будут содержать минимум данных о самих подписчиках, сохраняя для каждого из них только идентификатор. Если нужно отслеживать информацию о подписчиках, следует подумать о разработке стандартного приложения или использовать решение, основанное на членстве. Идентификатор, хранимый службами Notification Services, представляет собой связь между службами и решением для отслеживания информации о подписчиках.

    В нашем примере вы создадите базу данных для хранения всей информации, не специфичной для служб Notification Services. Эта база данных очень простая, но она полезна в качестве примера.

    Создаем особую базу данных приложения

  • В меню Start (Пуск) выберите All Programs,. Microsoft SQL Server 2005, SQL Server Management Studio (Все программы, Microsoft SQL Server 2005, Среда SQL Server Management Studio).
  • В меню File (Файл) выберите команду Open (Открыть), затем File (Файл). Найдите в папке My Documents\MicrosoftPress\ SQLAppliedTechSBS\Chapter13 сценарий BirdingDatabase Creation.sql.
  • Измените путь к файлу базы данных, чтобы он указывал на папку, в которой вы хотите создать базу данных.
  • Выполните сценарий, чтобы создать базу данных, таблицы и содержимое таблиц.
  • Создаем проект и решение SQL Server 2005 Management Studio

  • Откройте SQL Server Management Studio и установите соединение с сервером базы данных.
  • В меню File (Файл) выберите New, Project (Создать, Проект). Выберите в качестве шаблона SQL Server Scripts (Сценарии SQL Server). Этот шаблон используется потому, что SQL Server Management Studio не включает шаблонов проектов для служб Notification Services. Дайте проекту имя SQL2005StepByStep_NS. Выберите папку. Снимите флажок Create Directory For Solution (Создать каталог для решения). Нажмите кнопку ОК, чтобы создать проект.
  • Через Проводник Windows скопируйте из папки My Documents\MicrosoftPress\SQLAppliedTechSBS\Chapter13 в папку, в которой вы сохраняете проект, следующие файлы:
  • EmptyADF.xml
  • SQL2005StepByStepICF.xml
  • BirdingTransform.xslt (Этот файл не понадобится до окончательной обработки, просто добавьте его сейчас для удобства.)
  • В окне Solution Explorer (Обозреватель решений) щелкните правой кнопкой мыши SQL2005StepByStep_NS и выберите из контекстного меню команду Add Existing Item (Добавить существующий элемент). В диалоговом окне Add Existing Item (Добавление существующего элемента) выберите из раскрывающегося списка Files of Type (Типы файлов) All Files (Все файлы). Добавьте перечисленные выше два файла в проект. Оба файла будут помещены в папку Miscellaneous, как показано на рисунке:
  • Щелкните правой кнопкой мыши файл EmptyADF.xml и выберите из контекстного меню команду Rename (Переименовать). Измените имя файла на BirdingADF.xml.
  • В Проводнике Windows в папке проекта создайте новую папку с именем Notifications. В этой папке будут сохранять файлы, создаваемые в процессе доставки уведомлений.
  • Предупреждение. Кроме того, нужно выбрать учетную запись пользователя, которая будет действовать от имени экземпляра служб Notification Services. Эта учетная запись должна обладать необходимыми полномочиями на создание и изменение файлов в папках назначения.

    Основа приложения служб Notification Services

    Прежде, чем можно будет продолжить работу, требуется сделать несколько базовых определений приложения.

    Определение схем

    Файл ADF состоит из нескольких разделов, которые используются для описания схемы таблиц, содержащих информацию о событиях, подписках и уведомлениях. Как уже упоминалось ранее, файл ADF - это XML-файл, который должен соответствовать предварительно определенной схеме XSD.

    В терминах служб Notification Services, каждый отличающийся создаваемый тип элемента называется классом, например, класс событий или класс подписки. Каждый класс может содержать более одной таблицы. Классы можно даже разбивать на несколько таблиц и вновь соединять при помощи одного или более представлений, в зависимости от типа класса.

    Команды SQL, которые выполняют операции сопоставления или обновления, называются правилами, например, правило событий, правило хроники событий или запланированные правила.

    В следующих разделах мы создадим файл ADF, который будет содержать все схемы объектов, о которых здесь говорилось.

    Определяем класс событий

  • Откройте для редактирования файл BirdingADF.xml, выполнив двойной щелчок на нем в окне Solution Explorer (Обозреватель решений).
  • Просмотрите его содержание и найдите комментарии XML, которые служат указателями места заполнения для добавляемого содержимого.
  • Схема для событий должна включать следующие поля:
  • Регион
  • Дата и время наблюдения
  • Описание наблюдения
  • Категория наблюдения
  • Вместо комментария <!-- Replace with EventClasses XML --> введите или вставьте следующий фрагмент XML:

    <!- Event Classes -> 
    <EventClasses> 
      <EventClass>
        <EventClassName>SightData</EventClassName>
        <Schema> 
          <Field>
            <FieldName>RegionID</FieldName>
            <FieldType>varchar(5)</FieldType>
            <FieldTypeMods>not null</FieldTypeMods> 
          </Field> 
          <Field>
            <FieldName>Date</FieldName>
            <FieldType>datetime</FieldType>
            <FieldTypeMods>not null</FieldTypeMods> 
          </Field> 
          <Field>
            <FieldName>Observation</FieldName>
            <FieldType>nvarchar(500)</FieldType>
            <FieldTypeMods>not null</FieldTypeMods> 
          </Field> 
          <Field>
            <FieldName>Category</FieldName>
            <FieldType>char(1)</FieldType>
            <FieldTypeMods>not null</FieldTypeMods> 
          </Field> 
        </Schema> 
        <IndexSqlSchema> 
          <SqlStatement>
            CREATE INDEX myIndex
                ON SightData ( Date ); 
          </SqlStatement> 
        </IndexSqlSchema> 
      </EventClass> 
    </EventClasses>

    Обратите внимание на структуру содержимого. Она выглядит как обычное определение схемы базы данных, но выражено при помощи синтаксиса XML. Мы объявляем имя класса событий вместо имени таблицы, затем поля, типы данных, модификаторы для приема нулевых значений и т. д.

    Кроме того, при объявлении полей, которые будут формировать таблицу событий SightData, можно включить информацию об индексах, которые, по вашему мнению, полезно будет применить при обращении к таблице правила сопоставления. Таким образом, если известно, что правило сопоставления будет использовать данные столбца RegionID в качестве фильтра либо самостоятельно, либо в предложении JOIN, можно дать указание службам Notification Services создать соответствующие индексы. Это будет полезно в тех случаях, если данные поступают в больших пакетах; это не характерно для примера с Птицландией, поэтому в индексах нет необходимости. Элемент IndexSqlSchema показан просто как напоминание. Дополнительную информацию об использовании индексов для повышения производительности запросов можно найти в лекции 2 "Повышение производительности запроса".

    Дополнительная информация Для определения схем в ADF существуют дополнительные параметры. Дополнительную информацию о доступных элементах можно найти в Электронной документации по SQL Server 2005 в теме "Справочник по файлам определения приложений".

    Определение класса подписки.Введите или вставьте следующий XML-фрагмент ниже комментария <!— Subscription Classes —>:

    <!— Subscription Classes —> 
    <SubscriptionClasses> 
      <SubscriptionClass>
        <SubscriptionClassName>SightRegionSubs</SubscriptionClassName> 
        <Schema> 
          <Field> 
            <FieldName>DeviceName</FieldName> 
            <FieldType>nvarchar(255)</FieldType> 
            <FieldTypeMods>not null</FieldTypeMods> 
          </Field> 
          <Field>
            <FieldName>SubscriberLocale</FieldName> 
            <FieldType>nvarchar(10)</FieldType> 
            <FieldTypeMods>not null</FieldTypeMods> 
          </Field> 
          <Field>
            <FieldName>RegionID</FieldName> 
            <FieldType>varchar(5)</FieldType> 
            <FieldTypeMods>not null</FieldTypeMods> 
          </Field> 
        </Schema> 
        <EventRules> 
          <EventRule>
            <RuleName>SightRegionEventRule</RuleName>
            <EventClassName>SightData</EventClassName> 
            <Action>
              INSERT INTO SightAlerts(SubscriberId, DeviceName, SubscriberLocale, 
                 Region, Date, Observation, Category) 
              SELECT s.SubscriberId, s.DeviceName, s.SubscriberLocale,
                     e.RegionID, e.Date, e.Observation, e.Category 
                 FROM SightData e, SightRegionSubs s 
                 WHERE e.RegionID = s.RegionID; 
            </Action> 
          </EventRule> 
        </EventRules> 
      </SubscriptionClass> 
    </SubscriptionClasses>

    Объявление схем подписки аналогично объявлению классов событий в предыдущем разделе. Как и в предыдущем случае, мы указываем вместо имени таблицы имя класса подписки, затем имена полей и т. д.

    Определение подписки включает один важный объект: правило сопоставления событий. В правиле после класса событий указывается имя, к которому оно относится, а затем инструкция T-SQL, которая задает действующее правило.

    Для понимания этого правила нам придется немного забежать вперед. Задача инструкции RULE – вставка записей в таблицу, или класс, уведомлений, который мы еще не определили. Следовательно, ни имя таблицы назначения, ни поля, которые она содержит, нам не известны. Они будут определены ниже при определении класса уведомлений.

    Инструкция RULE собирает необходимые столбцы из двух исходных классов: класса событий и класса подписки, а также, что еще более важно, включает ключ для понимания отношения между этими двумя классами. В приведенном выше коде правило сопоставления сопоставляет идентификатор RegionID из класса событий идентификатору RegionID из класса подписки. Таким образом, подписчики получат уведомления, когда будет выполнено наблюдение в регионе, хранящемся в записи о подписке каждого подписчика.

    Определение класса уведомлений.Введите или вставьте следующий XML-фрагмент ниже комментария <!— Notification Classes —>:

    <!— Notification Classes —> 
      <NotificationClasses> 
        <NotificationClass>
          <NotificationClassName> SightAlerts </NotificationClassName> 
          <Schema> 
            <Fields> 
              <Field>
                <FieldName>Region</FieldName> 
                <FieldType>nvarchar(35)</FieldType> 
              </Field> 
              <Field>
                <FieldName>Date</FieldName> 
                <FieldType>datetime</FieldType> 
              </Field> 
              <Field>
                <FieldName>Observation</FieldName> 
                <FieldType>nvarchar(500)</FieldType> 
              </Field> 
              <Field>
                <FieldName>Category</FieldName> 
                <FieldType>char(1)</FieldType> 
              </Field> 
            </Fields> 
          </Schema> 
          <ContentFormatter>
            <ClassName>XsltFormatter</ClassName> 
            <Arguments> 
              <Argument>
                <Name>XsltBaseDirectoryPath</Name> 
                <Value>%_AppPath_%</Value> 
              </Argument> 
              <Argument>
                <Name>XsltFileName</Name> 
                <Value>BirdingTransform.xslt</Value> 
              </Argument> 
            </Arguments> 
          </ContentFormatter> 
          <Protocols> 
            <Protocol>
              <ProtocolName>File</ProtocolName> 
            </Protocol> 
          </Protocols> 
        </NotificationClass> 
      </NotificationClasses>

    Здесь содержимое схемы класса уведомлений также достаточно понятно, но содержит кое-что неожиданное. В данном случае схеме сопутствует элемент ContentFormatter. Элемент ContentFormatter указывает, какой компонент будет отвечать за формирование уведомления в окончательном виде. Подробнее об этом элементе будет рассказано ниже в разделе "Как скомпоновать сообщение уведомления?"

    Определение поставщиков.Введите или вставьте следующий XML-фрагмент ниже комментария <!— Replace with Providers —>:

    <!- Providers XML -> 
    <Providers>
      <NonHostedProvider>
        <ProviderName>BirdingSPEventProvider</ProviderName>
      </NonHostedProvider> 
    </Providers>

    Этот XML-фрагмент показывает, что поступит по маршруту, который находится не под управлением служб Notification Services. Нажмите кнопку Save (Сохранить) на панели инструментов, чтобы сохранить файл BirdingADF.xml, не потеряв изменений.

    Изменяем конфигурацию экземпляра

    На следующем этапе необходимо отредактировать ICF-файл. Этот файл представляет собой исходную точку, через которую службы Notification Services будут выполнять синтаксический анализ конфигурационных файлов и осуществлять все необходимые действия. Следовательно, он содержит некоторую основную информацию и данные, специфичные для экземпляра.

    Откройте для редактирования файл SQL2005StepByStepICF.xml, выполнив двойной щелчок на файле в окне Solution Explorer (Обозреватель решений). Нужно будет изменить его содержимое так, чтобы оно соответствовало действующей конфигурации компьютера.

  • В начале ICF-файла определяются параметры, которые будут использоваться в различных частях этого файла. Параметры _ DBEngineInstance_ и _ServerName_ будут использоваться многократно при определении ядра базы данных и сервера, поддерживающего экземпляр служб Notification Services. Если ваша конфигурация не отличается от указанной, оставьте значения без изменения.
  • Параметр _InstancePath_ показывает, в какой папке службы Notification Services будут искать файлы ICF. Измените его значение так, чтобы он указывал на папку, в которой мы сохранили проект служб Notification Services.
  • Обратите внимание на значение элемента InstanceName, которое в данном примере равно SQL2005StepByStep.
  • SqlServerSystem - это используемый сервер. Обратите внимание на то, что он просто уточняет параметр, определенный выше.
  • Элемент Applications содержит список и детали всех приложений, которые зависят от определяемого экземпляра.
  • Каждый элемент Application содержит имя приложения, каталог, в котором размещен соответствующий файл ADF, и имя ADF-файла. Обратите внимание на то, что текущий файл использует параметры, которые определены в начале этого файла.
  • Элемент DeliveryChannels объявляет доступные каналы и их свойства. В данном сценарии для облегчения восприятия указан только один канал file. Этот канал file требует аргумента в виде физического пути к файлу. Измените путь так, чтобы он соответствовал размещению папки Notifications, которая была создана в действии 6 ранее описанной процедуры "Создаем проект и решение SQL Server 2005 Management Studio"..Предупреждение. Не забудьте отредактировать параметр _InstancePath_ и аргумент FileName канала доставки, чтобы они соответствовали путям к файлам в вашей системе. Если вы этого не сделаете, экземпляр служб Notification Services не будет функционировать должным образом.

    Нажмите кнопку Save (Сохранить), чтобы сохранить файл ICF и не потерять изменения.

    Дополнительная информация Для определения объектов в файле ICF можно указать дополнительные параметры. Информацию о доступных элементах можно найти в Электронной документации по SQL Server 2005 в теме "Справочник по файлам определения экземпляра".
  • Первоначальное развертывание

    Чтобы развернуть и активизировать приложение уведомлений, требуется выполнить определенные действия. Этим действиям следует уделить особое внимание, потому что прежде чем экземпляр служб Notification Services начнет работать, он должен пройти несколько состояний. Если вы хотите, чтобы решение работало, нужно понимать суть выполняемых действий. Вот краткое описание процесса:

  • Создайте экземпляр в соответствии с параметрами, хранящимися в файле ICF. На этом этапе создаются все объекты инфраструктуры.
  • Зарегистрируйте экземпляр в операционной системе. На этом этапе выполняется конфигурация службы Windows, обработка пользователей и т. п.
  • Включите экземпляр, чтобы он мог получать запросы и события. Это действие эквивалентно запуску приложения, хотя включение создает состояние без обработки, аналогичное паузе.
  • Запустите экземпляр или службу Windows, ассоциированную с этим экземпляром. Это позволит приложению получать извещения о событиях внешнего мира и генерировать уведомления для доставки.
  • В завершение, выполните еще одно действие - обновление экземпляра. Это следует делать при каждом изменении конфигурации приложения.
  • Создаем экземпляр

    Чтобы создать новый экземпляр служб Notification Services (решение), выполните следующие действия:

  • Откройте SQL Server Management Studio и установите соединение с сервером базы данных.
  • В окне Object Explorer (Обозревателя объектов) щелкните правой кнопкой мыши узел Notification Services и выберите из контекстного меню команду New Notification Services Instance (Создать экземпляр служб Notification Services), как показано ниже.
  • Откроется окно New Notification Services Instance (Создание экземпляра служб Notification Services). Укажите путь к только что созданному файлу ICF (можно ввести его в строке ввода, вставить через буфер обмена или нажать кнопку Browse (Обзор) и выбрать файл).
  • Службы Notification Services выполнят синтаксический анализ файла ICF, чтобы извлечь параметры, которые в нем содержатся. Найденные параметры появятся в секции Parameters (Параметры) диалогового окна. Проверьте, все ли правильно. Параметры, которые отображаются на следующем рисунке – это частный случай; в вашем диалоговом окне будут отображаться другие папки и другое имя компьютера.
  • При нажатии кнопки ОК службы Notification Services приступают к обработке содержание файла ICF. Окно выполнения задания Creating New Notification Services Instance (Создание нового экземпляра служб Notification Services), показанное на следующем рисунке, отображает каждый этап и уведомляет пользователя об успехе или неудаче установки.
  • Если экземпляр был успешно создан, нажмите кнопку Close (Закрыть), чтобы закрыть окно выполнения задания. В противном случае прочитайте сообщение об ошибке и выполните соответствующие настройки, чтобы исправить данные ошибки. После исправления ошибок, повторите действия 2-5.
  • В SQL Server Management Studio изучите информацию в окне Object Explorer (Обозреватель объектов). Вы должны обратить внимание на некоторые новые элементы, появившиеся в этом окне (они показаны на следующем рисунке).
  • Новый экземпляр в дереве узла Службы Notification Services с именем SQL2005StepByStep.
  • Две новых базы данных в дереве узла Databases (Базы данных) с именами SQL2005StepByStepNSMain и SQL2005StepByStepBirding. При внимательном рассмотрении вы увидите, как много объектов (таблиц, представлений и хранимых процедур) для вас создают и обслуживают службы Notification Services.
  • Регистрируем экземпляр

    При помощи следующих действий мы сгенерируем службу Windows, которая будет ожидать входящих событий или запросов для экземпляра служб Notification Services.

  • В SQL Server Management Studio разверните дерево узла Службы Notification Services в обозревателе Object Explorer (Обозреватель объектов). Щелкните правой кнопкой мыши на экземпляре SQL2005StepByStep и выберите из контекстного меню команды Task, Register (Задачи, Зарегистрировать).
  • В диалоговом окне Register Instance (Регистрация экземпляра), которое показано на следующем рисунке, установите флажок Create Windows Server (Создать службу Windows) и укажите учетные данные соответствующей учетной записи, которая будет использоваться для запуска этой службы. Если учетные данные не будут указаны, то служба запустится под встроенной учетной записью Network Service, которая обладает небольшими полномочиями. В качестве альтернативы можно отредактировать службу напрямую и изменить входную учетную запись на LocalSystem или какую-либо другую. Однако рекомендуется использовать учетную запись домена, потому что в этом случае можно изолировать определенные разрешения, предоставляемые учетной записи, вместо того, чтобы изменять разрешения встроенной учетной записи. После ввода всех параметров нажмите кнопку ОК для регистрации экземпляра.Дополнительная информация Чтобы найти дополнительную информацию об учетных записях и безопасности в службах Notification Services, ознакомьтесь с темой "Настройка учетных записей Windows для экземпляра служб Notification Services" в Электронной документации по SQL Server 2005.
  • И снова диалоговое окно хода выполнения задания уведомит об успешном или неуспешном завершении процесса регистрации. В случае неудачи проблема, вероятнее всего, кроется в некорректных разрешениях. Проверьте настройки и повторите попытку регистрации. После того, как экземпляр будет успешно зарегистрирован, можно убедиться, что служба Windows существует в инструменте администрирования Services (Службы). Эта служба зарегистрирована под именем NS$SQL2005StepByStep. Инструмент Services (Службы) можно найти, выбрав из меню Start (Пуск) команды Control Panel, Administrative Tools, Services (Панель управления, Администрирование, Службы).
  • Хотя экземпляр служб Notification Services уже создан, он все еще не может обслуживать запросы. Чтобы он начал выполнять свои функции, необходимо включить и запустить экземпляр.

    Включаем экземпляр

  • В SQL Server Management Studio разверните дерево узла Службы Notification Services в обозревателе Object Explorer (Обозреватель объектов). Щелкните правой кнопкой мыши экземпляр и выберите из контекстного меню команду Enable (Включить).
  • В открывшемся диалоговом окне Enable Instance Confirmation (Подтверждение включения экземпляра) вам будет предложено внимательно проверить команду. Нажмите кнопку Yes (Да), чтобы включить экземпляр.
  • Запускаем экземпляр

  • Щелкните правой кнопкой мыши имя экземпляра в окне Object Explorer (Обозревателя объектов) и выберите из контекстного меню команду Start (Запустить).
  • В открывшемся диалоговом окне Start Instance Confirmation (Подтверждение запуска экземпляра) вам будет предложено внимательно проверить команду. Нажмите кнопку Yes (Да), чтобы запустить экземпляр.
  • Проверка состояния экземпляра

    К этому моменту все готово к бесперебойной работе. Можно просмотреть свойства экземпляра, чтобы убедиться в том, что все компоненты включены и/или запущены. Чтобы открыть диалоговое окно Instance Properties (Свойства экземпляра), показанное на следующем рисунке, щелкните правой кнопкой имя экземпляра и выберите из контекстного меню команду Properties (Свойства) (Чтобы убедиться в том, что запустились службы, перейдите на страницу Windows Services (Службы Windows)).

    Чтобы протестировать приложение, необходимо запустить событие и проверить, будет ли доставлено соответствующее уведомление.

    Обновление и модернизация экземпляра

    При каждом изменении содержимого файла ADF рабочий экземпляр приложения служб Notification Services необходимо обновить, чтобы вступили в действие сделанные изменения.

    Так же, как при настройке работы экземпляра, при обновлении следует всегда следовать одной и той же процедуре. Обновление - это процесс, обратный установке.

    Для обновления экземпляра выполните следующие действия.

  • Щелкните правой кнопкой мыши экземпляр в Object Explorer (Обозревателе объектов) и выберите из контекстного меню команду Stop (Остановить). Нажмите кнопку Yes (Да) в диалоговом окне Stop Instance Confirmation (Подтверждение остановки экземпляра).
  • Отключите экземпляр, щелкнув на нем правой кнопкой мыши и выбрав из контекстного меню команду Disable (Отключить). Нажмите кнопку Yes (Да) в диалоговом окне Disable Instance Confirmation (Подтверждение отключения экземпляра).
  • Запустите процесс обновления, щелкнув правой кнопкой имя экземпляра и выбрав из контекстного меню команды Task, Update (Задачи, Обновить).
  • Откроется диалоговое окно Update Instance (Обновление экземпляра). Укажите ICF-файл, как при первой настройке экземпляра. Затем нажмите кнопку ОК.
  • На экран будет выведено новое окно выполнения задания, которое показано на следующем рисунке.
  • Первый этап процесса заключается в сравнении обновленного ADF-файла с существующими данными экземпляра и приложения для выявления сделанных изменений. После изучения файлов процесс выносит заключение в диалоговом окне Update Summary (Сводная информация обновления), как показано на следующем рисунке.
  • Если все правильно, подтвердите предлагаемые изменения, щелкнув на кнопке Update (Обновить). Процесс попытается применить изменения к базе данных. В конце концов процесс либо успешно завершится, либо будет остановлен, если произойдет ошибка. На следующем рисунке показано диалоговое окно Updating Instance (Обновление экземпляра) с сообщением об ошибке. Можно щелкнуть это сообщение, чтобы просмотреть подробную информацию или задержать над ней указатель мыши, чтобы получить подсказку о содержании ошибки.
  • Если процесс завершился неудачей вследствие ошибки, исправьте ошибку и снова попытайтесь запустить процесс. После успешного завершения перезапустите экземпляр, включив и запустив его еще раз.
  • Запуск приложения

    К этому моменту мы создали приложение и должны проверить, как оно работает. Для этого мы воспользуемся несколькими простыми сценариями (системными и SQL Server) и выполним действия, описанные в следующих разделах.

    Добавление подписчиков, устройств и подписок в приложение

    В реальном мире мы использовали бы приложение для сбора необходимой информации о подписчиках, выбранных ими устройствах и подписках, которые им интересны. Характер приложения для управления подпиской может быть различным. Можно написать интерфейс, предназначенный специально для процесса управления подписками. В других случаях подписки создаются в результате действий какого-либо другого приложения. Например, если вы создаете решение для обработки информации о клиентах и заказов на книги через интернет, то при установке флажка "Я интересуюсь другими книгами этого автора" в фоновом режиме должна быть сформирована подписка.

    Дополнительная информация Дополнительную информацию о процессе подписки можно найти в теме "Разработка интерфейсов управления подпиской".

    Чтобы добавить подписчиков, в нашем примере мы используем несколько файлов VBScript. В реальной системе при использовании API Служб Notification Services выполняется точно такая же операция, как при использовании следующего сценария.

    Добавляем подписчиков и подписки

  • Через Проводник Windows скопируйте из папки My Documents\MicrosoftPress\SQLAppliedTechSBS\Chapter13 в папку, в которой вы сохраняете проект, следующие файлы:
  • AddSubscribers.vbs
  • AddSubscriptions.vbs
  • ViewSubscribersAndDevices.sql
  • ViewSubscriptions.sql
  • В SQL Server Management Studio щелкните правой кнопкой мыши SQL2005StepByStep в окне Solution Explorer (Обозреватель решений). Выберите из контекстного меню команды Add, Existing Item (Добавить, Существующий элемент). Добавьте перечисленные выше четыре файла в проект. Файлы .vbs будут помещены в папку Miscellaneous, а файлы .sql - в папку Queries.
  • Откройте файл AddSubscribers.vbs для просмотра, выполнив на нем двойной щелчок в окне Solution Explorer (Обозревателя решений).
  • В окне Visual Studio IDE невозможно запустить файл сценария VBScript. Поэтому вернитесь в окно Windows Explorer (Проводника Windows), выделите файл
  • Если что-либо пойдет не так, то на экран будет выведено диалоговое окно ошибки, аналогичное окну, показанному на следующем рисунке. Исправьте ошибку и еще раз запустите сценарий.
  • Повторите действие 4 для файла AddSubscriptions.vbs.
  • Вернитесь в окно SQL Server Management Studio, откройте файл запроса ViewSubscribersAndDevices.sql и запустите его. Если в окне результатов отображаются сведения о подписчиках, то сценарий работает правильно. Обратите внимание, что запрос обращен к представлению, а не к таблице.
  • Откройте файл запроса ViewSubscriptions.sql и выполните его. Если в окне результатов отображаются сведения о подписке, то сценарий работает правильно.
  • Передача событий приложению

    Обычно для передачи событий приложению используется один из стандартных поставщиков событий. Вы можете передавать события через модель объекта Event (API объекта событий), упакованными в XML-файлы (XML API), или через предоставляемые хранимые процедуры (API SQL Server).

    Дополнительная информация Дополнительную информацию о событиях можно найти в теме "Определение поставщиков событий" Электронной документации по SQL Server 2005.

    В нашем примере мы воспользуемся двумя простыми сценариями SQL, которые используют хранимые процедуры API SQL Server.

  • Через Проводник Windows скопируйте из папки My Documents\MicrosoftPress\SQLAppliedTechSBS\Chapter13 в папку, в которой вы сохраняете проект, следующие файлы:
  • AddSightEvents.sql
  • ViewSightEvents.sql
  • В SQL Server Management Studio щелкните правой кнопкой мыши SQL2005StepByStep в окне Solution Explorer (Обозреватель решений). Выберите из контекстного меню команды Add, Existing Item (Добавить, Существующий элемент). Добавьте эти два файла в проект. Они будут помещены в папку Queries.
  • Откройте файл AddSightEvents.sql для просмотра, выполнив на нем двойной щелчок в окне Solution Explorer (Обозревателя решений). Обратите внимание на то, что события были добавлены при помощи двух хранимых процедур с именами NSEventBeginBatchSightData и NSEventWriteSightData. Первая хранимая процедура запускает пакет событий, а вторая добавляет определенные события. Когда пакет событий завершается, сценарий выполняет хранимую процедуру NSEventFlushBatchSightData, чтобы сообщить службам Notification Services о том, что пакет готов для обработки. Службы Notification Services обрабатывают события пакетом для повышения производительности. Если вы не можете передать пакет, то службы Notification Services могут запуститься, когда события все еще передаются приложению, тем самым снижается эффективность широковещательной рассылки уведомлений и набора функций.
  • Выполните сценарий: Он возвратит идентификатор пакета событий EventBatchID и количество событий, полученных приложением. Запишите идентификатор EventBatchID, он понадобится в следующем действии. Если вы в первый раз выполняете этот сценарий, идентификатор EventBatchID будет иметь значение 1. При каждом последующем выполнении значение идентификатора EventBatchID будет увеличиваться.
  • Чтобы проверить события в системе, откройте сценарий ViewSightEvents. Просмотрите его и измените значение параметра @EventBatchId так, чтобы оно соответствовало идентификатору EventBatchId, который был возвращен в предыдущем действии.
  • Выполните сценарий: Он возвратит сведения об EventBatch и информацию о событии.
  • Определение подписчиков, которым следует отправить уведомления

    Пока мы наблюдали за событиями, система проверила, существует ли событие, и запустила генерацию уведомления. Службы Notification Services периодически проверяют наличие новых событий и выполняют правило события, которое содержится в ADF-файле, в классе подписки. Правило события выполняет вставку записи в таблицу уведомлений. В данном примере таблица уведомлений - это таблица SightAlerts. Мы видим, что имя таблицы уведомлений совпадает с именем класса уведомлений, определенного в ADF.

    Можно проверить, какие уведомления предположительно будут переданы, выполнив следующие действия.

    Проверяем уведомления

  • Через Проводник Windows скопируйте из папки My Documents\MicrosoftPress\SQLAppliedTechSBS\Chapter13 в папку, в которой вы сохраняете проект, следующий файл:
  • ViewNotifications.sql
  • В SQL Server Management Studio щелкните правой кнопкой мыши SQL2005StepByStep в окне Solution Explorer (Обозреватель решений). Выберите из контекстного меню команды Add, Existing Item (Добавить, Существующий элемент). Добавьте этот файл в проект. Файл будет помещен в папку Queries.
  • Откройте и запустите сценарий ViewNotifications.sql. В панели Results (Результаты) отобразится состояние уведомлений.Предупреждение. Распространитель (описанный в следующем разделе) выполняется по собственному расписанию, следовательно, на отображение результатов может потребоваться некоторое время. Возвращайтесь к запросу каждые несколько секунд, пока он не возвратит успешное или неудачное состояние доставки для каждого уведомления в очереди.
  • Компоновка сообщения уведомления

    После того, как правило события сгенерирует соответствующие записи в таблице уведомлений, в действие вступает еще один процесс, который называется распространителем. Распространитель выполняет две задачи: формирование окончательного форматированного готового к доставке уведомления и передача этого форматированного содержимого действующим модулям доставки. Распространитель использует компонент форматирования содержимого для первой из этих двух задач, а для второй задачи вызывает внешние для решения серверы.

    Окончательная форма уведомления формулируется в ADF/ICF. Как мы видели при создании файла ADF, в конце определения класса уведомлений объявляется соответствующий модуль форматирования содержимого. Атрибуты модуля форматирования содержимого определяют имя модуля форматирования и обязательные аргументы. Модуль форматирования XsltFormatter - это один из стандартных модулей, который, кроме указания трех аргументов, о которых рассказывается далее в этом разделе, не требует настройки. Другие модули форматирования требуют полного уточненного имени и дополнительной информации, которая позволяет службам Notification Services найти и использовать их.

    Стандартный модуль форматирования XsltFormatter использует три аргумента:

  • Каталог размещения файлов XSLT. Он соответствует аргументу XsltBaseDirectoryPath.
  • Действующее имя применяемого файла XSLT. Оно соответствует аргументу XsltFileName.
  • По желанию можно указать модулю форматирования содержимого, что данные, содержащиеся в таблице уведомлений, уже имеют формат XML или HTML и не нуждаются в дальнейшей кодировке содержимого. Вы можете воспользоваться этой функцией, указав аргумент DisableEscaping. Значение по умолчанию для этого аргумента равно false.
  • Дополнительная информация Дополнительную информацию о модулях форматирования содержимого можно найти в теме "Настройка модулей форматирования данных" в Электронной документации по SQL Server 2005.

    В нашем примере аргументы, перечисленные выше, соответствуют переменной _AppPath_ для пути к основному каталогу и файлу BirdingTransform.xslt для имени файла XSLT.

    Обратите внимание на то, что под записью модуля форматирования содержимого находится запись протокола. Эта запись указывает на определение протокола в ICF.

    Просмотрев файл ICF, найдите элемент DeliveryChannel в конце файла. Этот элемент включает элемент ProtocolName, аргумент которого указывает на файл HTML в папке Notifications, которую мы создали в начале этой лекции.

    Итак, Распространитель проверяет представления таблицы уведомлений. Здесь он находит информацию об идентификаторе подписчика ( SubscriberID ), канале доставки ( DeliveryChannel ), языковому стандарту подписчика ( SubscriberLocale ), имени устройства ( DeviceName ) и адресе устройства ( DeviceAddress ). С помощью этой информации он может вызвать модуль форматирования, чтобы сформировать "сообщения" уведомлений и скомпоновать вывод для доставки.

    Доставка уведомлений

    Если в качестве канала доставки используется файл, то процесс завершается после того, как файл будет сгенерирован, дальнейшее распространение не требуется.

    Вы можете проверить результаты нашего примера, просмотрев их в папке Notification, которую мы создали в папке проекта при настройке инфраструктуры. Здесь вы найдете файл с именем SightNotifications.htm, который должен содержать форматированное уведомление в виде строки.

    Предупреждение. Если файл SightNotifications.htm окажется пустым, убедитесь, что файл BirdingTransform.xslt находится в каталоге проекта в соответствии с инструкциями, которые были даны ранее в этой лекции.

    Доставка в реальном мире, вероятнее всего, будет гораздо более сложной. Подробное рассмотрение настройки конфигурации сервера в данной книге не предполагается. Однако пример, который мы использовали, обеспечивает хорошую исходную точку для понимания принципов работы служб Notification Services.

    Заключение

    В этой лекции рассказывалось об основах настройки и использования приложений уведомлений при помощи компонента SQL Server 2005 Службы Notification Services.

    Вы можете продолжить разработку примера, представленного в этой лекции, и добавить режим обработки архивных данных, дополнительные каналы доставки и функции многоязыковой поддержки.

    SQL Server – мощная платформа для установки базы данных, которая не только предоставляет базовые функции хранения и извлечения данных. Мы наблюдали, как SQL Server 2005 обеспечивает безопасность, защиту, передачу и сводные данные. Мы также видели, как SQL Server организует и хранит данные, при этом у читателя сложилось определенное понимание принципов оптимизации извлечения данных путем изменения внутренней структуры хранения. Вы научились использовать удаленные источники данных, осуществлять доступ к SQL Server через интернет, а также разрешать пользователям безопасно создавать свои запросы через интерфейс созданных вами приложений. Вы узнали, как использовать транзакции для защиты пользовательских данных и как хранить архивные данные, чтобы можно было выполнить откат отдельных транзакций. Кроме того, теперь вы знаете, как использовать эффективные инструменты SQL Server 2005 для работы с отчетами и уведомлениями. То есть, у вас теперь есть все, что нужно для того, чтобы начать более эффективно использовать установку SQL Server 2005 - это немного практики и вся необходимая информация, которую вы легко найдете в этой книге.

    Краткий справочник по 9 лекции

    Чтобы Выполните следующие действия
    Создать новый проект для служб Notification Services Создайте специальную базу данных приложения, затем в SQL Server Management Studio выберите из меню File (Файл) команды New, Project (Создать, Проект) и далее выберите в качестве шаблона проекта SQL Server Scripts (Сценарии SQL Server). Добавьте файлы ADF и ICF.
    Создать основу приложения служб Notification Services Определите классы событий, подписок, уведомлений и поставщиков.
    Развернуть приложение служб Notification Services Создайте, зарегистрируйте, включите и запустите экземпляр служб Notification Services.
    Создать экземпляр служб Notification Services В Object Explorer (Обозревателе объектов) в SQL Server Management Studio щелкните правой кнопкой мыши узел Службы Notification Services и выберите из контекстного меню New Notification Services Instance (Новый экземпляр служб Notification Services).
    Зарегистрировать экземпляр служб Notification Services В Object Explorer (Обозревателе объектов) в SQL Server Management Studio разверните узел Службы Notification Services, щелкните правой кнопкой мыши экземпляр и выберите из контекстного меню команды Task, Register (Задачи, Зарегистрировать).
    Включить экземпляр служб Notification Services В Object Explorer (Обозревателе объектов) в SQL Server Management Studio разверните узел Службы Notification Services, щелкните правой кнопкой мыши экземпляр и выберите из контекстного меню команду Enable (Включить). Запустить экземпляр В Object Explorer (Обозревателе объектов) в SQL служб Notification Server Management Studio разверните узел Services Службы Notification Services, щелкните правой кнопкой мыши экземпляр и выберите из контекстного меню команду Start (Запустить).
    Обновить экземпляр служб Notification Services Остановите и отключите экземпляр; затем в Object Explorer (Обозревателе объектов) в SQL Server Management Studio разверните узел Службы Notification Services, щелкните правой кнопкой мыши экземпляр и выберите из контекстного меню команду Update (Обновить).
    Вернуться к учебному плану