Регистрация временной подписки
Временные подписки запрашивают событие для определенного объекта подписчика, который уже существует. Временные подписки хранятся в каталоге COM+, но подписка удаляется, если система событий или операционная система остановлена. В отличие от постоянных подписок, временные подписки привязаны к конкретному объекту и хранятся только в системе событий. Если возникла проблема с системой событий или операционной системой, подписка исчезнет. Временные подписки могут быть более эффективными, чем постоянные подписки, но необходимо управлять жизненными циклами объектов.
Временные подписки нельзя задать с помощью средства администрирования служб компонентов. Для создания или обновления временной подписки необходимо использовать административные интерфейсы COM+.
Visual Basic
В следующей процедуре описывается создание временной подписки с помощью Microsoft Visual Basic:
Укажите подписку как временную, добавив новую запись в коллекцию TransientSubscriptions и задав свойство SubscriptionInterface интерфейсу IUnknown объекта подписчика. События COM+ не создают новый экземпляр объекта подписчика при запуске события, а вместо этого использует указанный экземпляр. События COM+ содержат количество ссылок для объекта подписчика, пока подписка не будет удалена из системы.
Создайте серверное приложение COM+ (.exe, .dll или ocx-файл) с объектом, реализующим интерфейсы или методы, на которые вы хотите подписаться.
Создайте временную подписку с помощью следующего кода, передав clSID объекта класса событий и экземпляр объекта подписчика. С помощью средства администрирования служб компонентов можно получить свойство EventCLSID, щелкнув правой кнопкой мыши компонент COM+, выбрав свойства и выбрав вкладку "Общие ".
Public Function CreateTransientSubscription( _ ByVal clsid As String, ByVal objref As Object) As String Dim oCOMAdminCatalog As COMAdmin.COMAdminCatalog Dim oTSCol As COMAdminCatalogCollection Dim oSubscription As ICatalogObject Dim objvar As Variant On Error GoTo CreateTransientSubscriptionError Set oCOMAdminCatalog = CreateObject("COMAdmin.COMAdminCatalog") 'Gets the TransientSubscriptions collection Set oTSCol = oCOMAdminCatalog.GetCollection( _ "TransientSubscriptions") Set oSubscription = oTSCol.Add Set objvar = objref oSubscription.Value("SubscriberInterface") = objref oSubscription.Value("EventCLSID") = clsid oSubscription.Value("Name") = "TransientSubscription" oTSCol.SaveChanges CreateTransientSubscription = oSubscription.Value("ID") Set oSubscription = Nothing Set oTSCol = Nothing Set oCOMAdminCatalog = Nothing Set objvar = Nothing Exit Function CreateTransientSubscriptionError: CreateTransientSubscription = "" Err.Raise Err.Number, "[CreateTransientSubscription]" & _ Err.Source, Err.Description End Function
В следующем примере показано, как вызвать функцию CreateTransientSubscription для подписки на интерфейс с именем IStockTicker, который имеет метод с именем UpdateStock.
Создайте класс событий, поддерживающий интерфейс IStockTicker, имеющий один метод UpdateStock.
В проекте подписчика добавьте класс, реализующий интерфейс IStockTicker.
Если вы хотите подписаться, выполните следующий код:
Dim oMyTicker As Object Dim sSubscriptionID As String Set oMyTicker = CreateObject("TheProject.CMyTicker") sSubscriptionID = CreateTransientSubscription( _ "{..CLSID for the Event Class..}", oMyTicker)
Функция CreateTransientSubscription возвращает строку, которая является GUID, который можно использовать в качестве дескриптора или файла cookie для отзыва подписки позже. Чтобы удалить подписку, вызовите метод Remove COM Администратор CatalogCollection в коллекции TransientSubscriptions, передав индекс, соответствующий подписке с идентификатором GUID, полученным ранее.
См. также