В документации по 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.
Комментариев нет:
Отправить комментарий