22 июн. 2010 г.

Внешняя активация Service Broker с помощью Windows Management Instrumentation

 В документации по Service Broker написано, что при обработке сообщений Service Broker имеется возможность использовать внешнюю активацию. Данная возможность доступна для всех редакций серверов Microsoft SQL Server, начиная с версии 2005.
 Данная статья раскрывает подробности этого типа активации с использованием Windows Management Instrumentation (WMI) - одной из базовых технологий централизованного управления и слежения за работой различных частей компьютерной инфраструктуры под управлением платформы Windows. С помощью WMI можно настроить оповещение об активации компонента Service Broker, установленного, в том числе, и на другом компьютере. Это позволяет вынести обработку сообщений на отдельный сервер и тем самым снизить нагрузку на сервер баз данных.

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

using System;
using System.Management;

namespace TestWmiActivation
{
 class Program
 {
  static void Main(string[] args)
  {
   /* Строка запроса WQL
    * обязательно укажите правильные имя базы данных,
    * схемы, типа и имени объекта, иначе WMI
    * будет пытаться получать сообщения ото всех
    * подходящих под ограничение объектов сервера,
    * и, вероятнее всего Вы получите ошибку AccessDenied.
    * В данном примере, мы собираемся получать оповещения
    * об активации компонента Service Broker для
    * базы данных WmiTest, схемы dbo, и очереди сообщений
    * TestQueue
    */

   string query = @"select * from QUEUE_ACTIVATION" +
       @" where DatabaseName = 'WmiTest'" +
       @" and SchemaName = 'dbo'" +
       @" and ObjectType='QUEUE'" +
       @" and ObjectName='TestQueue'";

   /* Пространство имен для управляющих операций
    * Здесь можно указать полный путь к серверу (для
    * подключения к локальному серверу можно указать
    * путь '\\.\'), к пространству имен которого мы хотим
    * подключиться и имя инстанса Microsoft SQL Server
    * (для установки по умолчанию - MSSQLSERVER)
    */

   string managementPath =
    @"\\.\root\Microsoft\SqlServer\ServerEvents\MSSQLSERVER";

   ManagementScope scope = new ManagementScope(managementPath);
   scope.Connect();

   // Создаем подписку на оповещения
   ManagementEventWatcher watcher =
    new ManagementEventWatcher(new WqlEventQuery(query));
   // Указываем обработчик события
   watcher.EventArrived +=
    new EventArrivedEventHandler(watcher_EventArrived);
   // Указываем область пространства имен
   watcher.Scope = scope;

   Console.WriteLine("Watching...");

   // Запускаем подписчика
   watcher.Start();

   Console.ReadLine();
  }

  /* Процедура обработки события
   * Запускается при поступлении нового сообщения в очередь
   * сообщений, активацию которой мы отслеживаем
   */

  static void watcher_EventArrived(
   object sender, EventArrivedEventArgs e)
  {
   ManagementBaseObject obj =
    e.NewEvent as ManagementBaseObject;

   foreach (var data in obj.Properties)
    Console.WriteLine("{0}: {1}", data.Name,
     data.Value == null ? "null" : data.Value.ToString());
  }
 }
}


Дополнительную информацию об использовании запросов WQL с поставщиком WMI для событий сервера Microsoft SQL Server, Вы можете почитать на сайте MSDN.

 

Комментариев нет:

Отправить комментарий