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