HOWTO: 将对象以参数形式传递到 COM+ 列队组件中

文章翻译 文章翻译
文章编号: 246627 - 查看本文应用于的产品
本文的发布号曾为 CHS246627
本文已归档。它按“原样”提供,并且不再更新。
展开全部 | 关闭全部

本文内容

概要

列队组件允许您调用对象函数,该函数能通过 Microsoft Message Queue Server (MSMQ) 记录、传递,然后在配置列队组件的服务器上重新播放。 在某些情况下,所记录函数的参数中可以包括对象。 这可以通过列队组件来完成,为了使方法调用在服务器重新播放时重新创建变量对象,必须遵循一定的规则:
  • 作为变量传递的对象必须支持 IPersistStream。 在 Visual Basic 中,它必须标记为 persistable,并且必须正确地实现 Class_ReadProperties 及 Class_WriteProperties 函数。
  • 作为变量传递的对象类必须同时在客户计算机和服务器计算机上正确注册。
  • 除上述以外,列队创建的组件实例可以作为参数传递给第二个列队组件。

更多信息

如何工作



调用列队组件并且对象作为变量传递时会发生什么情况?

示例: 假设您有一个用于管理用户信息的对象(称为 Customer.CCustomer),此对象在 Customer.dll 文件中实现并具有下列代码。 注意它被标记为 persistable,并注意实现它的正确方法:
'CCustomer Class. Marked as 'Persistable'
Option Explicit

Public Name As String
Public Age As Integer
Public Address As String

Private Sub Class_ReadProperties(PropBag As PropertyBag)
    Name = PropBag.ReadProperty("Name")
    Age = PropBag.ReadProperty("Age")
    Address = PropBag.ReadProperty("Address")
    MsgBox "Person read!!"
End Sub

Private Sub Class_WriteProperties(PropBag As PropertyBag)
    PropBag.WriteProperty "Name", Name
    PropBag.WriteProperty "Age", Age
    PropBag.WriteProperty "Address", Address
    MsgBox "Person Written!!"
End Sub

Private Sub Class_Initialize()
    MsgBox "CCustomer Class_Initialize"
End Sub

Private Sub Class_Terminate()
    MsgBox "CCustomer Class_Terminate"
End Sub
该样例类除执行缓存信息外不完成其它任何工作。 然而,在实际编程中,可能需要其它的方法(不在 Class_Initialize 中实现消息框!)。

现在假设有一个用于服务器的对象。 该对象被称为 Orders.COrder,位于单独的文件 (Orders.dll) 中,其中的函数具有下列代码:
Public Sub AddOrder(ByVal ItemID As Long, ByVal Amount As Double, ByVal Customer As Customer.CCustomer)
    
    MsgBox "Customer order for item '" & ItemID & "' for " & Customer.Name
    
End Sub
注意定单的用户信息被直接指定为 Customer.CCustomer 类型的一个对象。在实际情况中,您可能会用此方法参与某些数据库活动。 然而,在本例中,您所做的只是显示一个消息框。

而且最后(不是最少)有客户端可执行应用程序。 所有这些只有表单和命令按钮,其中可以键入下列代码:
    Dim oOrder As COrder
    
    Dim oCust As CCustomer
    Set oCust = New CCustomer
    oCust.Name = "Eduardo A. Jezierski"
    oCust.Age = 23
    oCust.Address = "One Microsoft Way, Redmond, WA"
    
    Set oOrder = New COrder    
    oOrder.AddOrder 123, 100, oCust
    Set oOrder = Nothing
    
    Set oCust = Nothing
如果您在 COM+ 内部已经配置定单组件,并将它添加到 COM+ 应用程序。 当用户在客户端单击该按钮时,出现下列情况:
  1. 创建 CCustomer 对象(出现 CCustomer Class_Initialize 消息框)并由客户端填写。
  2. 创建 COrder 对象。
  3. 在 COM+ 应用程序中执行 AddOrder 方法。
  4. 出现消息框,显示 Customer order for item '123' for Eduardo A. Jezierski。
  5. 销毁 COrder 实例。
  6. 销毁 CCustomer 实例,并出现 CCustomer Class_Terminate 消息框。

添加队列



如果添加列队组件会出现什么情况?

要进行测试,先将 Corder 配置成列队组件。 请参见下列 Microsoft Knowledge Base 文章以得到有关说明:
246825 HOWTO: 将 COM+ 应用程序配置为 Queued Component
接着,更改客户端应用程序以便创建队列组件。 为此,更改创建 COrder 的行如下:
Set o = GetObject("queue:/new:Orders.COrder")
这将提供“stand-in”COrder 对象,该对象将记录方法调用,并将这些方法调用分发到 COM+ 应用程序中的 COrder 对象上。

应用程序的其它部分保持不变。 然而,当测试时,将出现完全不同的一组事件:
  1. 首先,创建用户对象并由客户端填写。
  2. 使用指定 Moniker 的 GetObject 函数创建 COrder 列队记录者实例。
  3. 调用 AddOrder 方法。 表现为 COrder 的 QC 记录器接收Customer 对象, Customer 对象的 Class_WriteProperties 函数得到调用, 它的状态和其它参数(ItemID 及 Amount)被持久化
  4. COrder 记录实例被设置成 Nothing。 此时,所有对它(本例中为 AddOrder)进行的调用客户端安全令牌及其它信息一起打包,包装在 Message Queue Server (MSMQ) 消息中,并发送到目标应用程序。
  5. 完成这项工作后,客户端销毁 Customer 实例并结束工作。

    同时...



  6. 一旦发送消息,即假设该消息最终到达目标应用程序的列队。
  7. 由于应用程序被设置为“侦听”消息,它将检测到达的 MSMQ 消息,并分析出消息是属于用户 X 使用的 COrder 类。 完成访问检查后,它就在服务器上创建 COrder 实例。
  8. 现在便开始进行“重新播放”部分。 QC 播放器开始调用储存于消息中的方法记录。
  9. 本例中指的是 AddOrder 方法。 然而,由于参数包含 Customer 对象,所以首先创建 CCustomer 实例,然后该实例通过 Class_ReadProperties 函数加载其本身。
  10. 加载实例后,播放器在真正的 COrder 对象上调用 AddOrder 方法,以便能正常开始工作。 它传递新 Customer 实例作为调用变量,调用完成后便销毁临时实例。 然后便以相似的方式调用任何其它记录的调用,并释放 COrder 对象及临时 CCustomer 实例。
执行的 COrder 代码不知道所使用的 Customer 实例是本地实例, 与几分钟或几小时之前存储于客户端的 Customer 对象不同。 通过这种方法,完整地保持了异步模型。 在这种情况下,可以保持完整的不同步模型。

参考

有关详细信息和相关的 COM+ 1.0 服务,请参见 MSDN Online Web 站点上的 Queued Components

属性

文章编号: 246627 - 最后修改: 2014年2月24日 - 修订: 2.0
这篇文章中的信息适用于:
  • Microsoft Visual Studio 6.0 Service Pack 5
  • Microsoft Visual Basic 6.0 专业版
  • Microsoft Visual Basic 6.0 企业版
关键字:?
kbnosurvey kbarchive kbhowto kboswin2000 _ik kbvs600 kbvbp kbcomplusqc KB246627
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com