Share via


Registrando uma assinatura transitória

As assinaturas transitórias solicitam um evento para um objeto de assinante específico que já existe. As assinaturas transitórias são armazenadas no catálogo COM+, mas a assinatura é excluída se o sistema de eventos ou o sistema operacional for interrompido. Ao contrário das assinaturas persistentes, as assinaturas transitórias são vinculadas a um objeto específico e são armazenadas apenas no sistema de eventos. Se houver um problema com o sistema de eventos ou sistema operacional, a assinatura desaparecerá. As assinaturas transitórias podem ser mais eficientes do que as persistentes, mas você deve gerenciar seus ciclos de vida de objeto.

As assinaturas transitórias não podem ser definidas usando a ferramenta de administração Serviços de Componentes. Você deve usar as interfaces administrativas COM+ para criar ou atualizar uma assinatura transitória.

Visual Basic

O procedimento a seguir descreve como criar uma assinatura transitória usando o Microsoft Visual Basic:

  1. Especifique uma assinatura como transitória adicionando uma nova entrada à coleção TransientSubscriptions e definindo a propriedade SubscriberInterface para a interface IUnknown do objeto de assinante. COM+ Events não cria uma nova instância do objeto de assinante ao disparar um evento, mas usa a instância especificada. COM+ Events mantém uma contagem de referência para o objeto de assinante até que a assinatura seja removida do sistema.

  2. Crie um aplicativo de servidor COM+ (um arquivo .exe, um .dll ou .ocx) com um objeto que implemente as interfaces ou métodos que você deseja assinar.

  3. Crie sua assinatura transitória usando o código a seguir, passando o CLSID do objeto de classe de evento e a instância do objeto de assinante. Usando a ferramenta administrativa Serviços de Componentes, você pode obter a propriedade EventCLSID clicando com o botão direito do mouse no componente COM+, selecionando Propriedades e selecionando a guia Geral.

    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
    

O exemplo a seguir ilustra como chamar a função CreateTransientSubscription para assinar uma interface chamada IStockTicker, que tem um método chamado UpdateStock.

  1. Crie uma classe de evento que ofereça suporte à interface IStockTicker, que tem um método, UpdateStock.

  2. Em seu projeto de assinante, adicione uma classe que implementa a interface IStockTicker.

  3. Quando você quiser se inscrever, execute o seguinte código:

    Dim oMyTicker As Object
    Dim sSubscriptionID As String
    Set oMyTicker = CreateObject("TheProject.CMyTicker")
    sSubscriptionID = CreateTransientSubscription( _
      "{..CLSID for the Event Class..}", oMyTicker)
    

A função CreateTransientSubscription retorna uma cadeia de caracteres, que é um GUID que pode ser usado como um identificador ou um cookie para revogar a assinatura posteriormente. Para remover a assinatura, chame o método Remove de COMAdminCatalogCollection na coleção TransientSubscriptions, passando o índice correspondente à assinatura com o GUID recebido anteriormente.

Registrando uma assinatura