注册暂时性订阅
暂时性订阅为已经存在的特定订户对象请求事件。 暂时性订阅存储在 COM+ 目录中,但如果事件系统或操作系统停止,则会删除订阅。 与永久性订阅不同,暂时性订阅绑定到特定对象,并且仅存储在事件系统中。 如果事件系统或操作系统出现问题,则订阅将消失。 暂时性订阅比永久性订阅更高效,但必须管理其对象生命周期。
无法使用组件服务管理工具设置暂时性订阅。 必须使用 COM+ 管理接口来创建或更新暂时性订阅。
Visual Basic
以下过程介绍如何使用 Microsoft Visual Basic 创建暂时性订阅:
通过向 TransientSubscriptions 集合添加一个新条目,并将 SubscriberInterface 属性设置为订阅对象的 IUnknown 接口,将订阅指定为暂时性订阅。 COM+ 事件在触发事件时不会创建订户对象的新实例,而是使用指定的实例。 COM+ 事件保存订户对象的引用计数,直到从系统中删除订阅。
使用实现要订阅的接口或方法的对象创建 COM+ 服务器应用程序(.exe、.dll 或 .ocx 文件)。
通过传入事件类对象的 CLSID 和订户对象的实例,使用以下代码创建暂时性订阅。 使用组件服务管理工具,可以右键单击 COM+ 组件,选择属性,然后选择常规选项卡,获取 EventCLSID 属性。
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 以稍后撤消订阅。 若要删除订阅,请对 TransientSubscriptions 集合调用 COMAdminCatalogCollection 的 Remove 方法,并传入与之前收到的 GUID 对应的订阅的索引。
相关主题