Cómo pasar objetos como parámetros a COM + en cola de componentes

Seleccione idioma Seleccione idioma
Id. de artículo: 246627 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

En esta página

Resumen

En la cola de componentes permiten llamar a funciones de objeto que se registrarán reenvía a través de Microsoft Message Queue Server (MSMQ) y, a continuación, reproducirse en el servidor donde el componente en cola está configurado. En algunos casos, los parámetros de las funciones que se está grabando pueden incluir objetos. Puede hacerlo con los componentes en cola, pero debe seguir ciertas reglas para el objeto de argumento que se vuelve a crear cuando se reproduce la llamada al método en el servidor:
  • El objeto se pasa como argumento debe admitir IPersistStream. En Visual Basic, deben marcarse como "con persistencia" y se deben implementar las funciones Class_ReadProperties y Class_WriteProperties correctamente.
  • La clase de objeto se pasa como argumento debe registrarse correctamente en el equipo cliente y el equipo servidor.
  • Independientemente de lo anterior, se puede pasar una instancia de componente creada como en cola como un parámetro a un segundo componente en cola.

Más información

Cómo funciona

¿Lo que ocurre cuando se realiza una llamada a un componente en cola y se pasa un objeto como argumento?

Éste es un ejemplo: suponga que tiene un objeto que se utiliza para administrar información de cliente denominada Customer.CCustomer. Este objeto se implementa en el archivo Customer.dll y tiene el siguiente código. Observe que está marcado como con persistencia y observe su implementación de los métodos apropiados:
'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
				
esta clase de ejemplo no hace nada excepto la información se almacena en caché. En un escenario real, sin embargo, probablemente tendrá otros métodos (sin cuadros de mensaje en Class_Initialize y!).

Ahora imagine que hay un objeto que está diseñado para su uso de servidor. Este objeto se denomina Orders.COrder, está en un archivo independiente denominado Orders.dll y tiene una función con el código siguiente:
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
				
Observe que la información de cliente para el pedido directamente se especifica como un objeto de tipo Customer.CCustomer. En el mundo real, probablemente sería entablan en alguna actividad base de datos en este método. Sin embargo, en este ejemplo todo lo que debe hacer es generar un cuadro de mensaje.

Y última pero no menos importante, hay el cliente de aplicación EXE. Todo esto tiene es un formulario y un botón de comando en el que escriba el siguiente código:
    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
				
decir haya configurado el componente de pedidos dentro de COM +, agregarlo a una aplicación. Cuando un usuario hace clic en el botón en el cliente, ocurre lo siguiente:
  1. Un objeto CCustomer con crea (provocar el cuadro de mensaje CCustomer con Class_Initialize ) y rellena con el cliente.
  2. Se crea un objeto COrder.
  3. El método AddOrder se ejecuta en COM + aplicación.
  4. Aparece un cuadro de mensaje indicando "Pedido de cliente para el elemento '123' para Eduardo r. Jezierski".
  5. Se destruye la instancia COrder.
  6. Se destruye la instancia CCustomer con, muestre el cuadro de mensaje Class_Terminate CCustomer con .

Acercar las colas

Por lo tanto, qué ocurre ahora si poner en componentes en cola

Para comprobar esto, configurar primero el componente COrder como en cola. Consulte el siguiente artículo de Knowledge Base para obtener instrucciones:
246825Cómo configurar una aplicación para componentes en cola
A continuación, modifique la aplicación cliente para que los componentes creados en la cola. Para ello, cambie la línea donde se crea el COrder que como sigue:
Set o = GetObject("queue:/new:Orders.COrder")
				
esta eficaz le proporcionará un objeto de "repuesto" COrder que registrará las llamadas al método y lo envía al objeto COrder sentado en la aplicación.

El resto de la aplicación permanece igual. Cuando lo prueba, sin embargo, se produce un conjunto muy diferente de eventos:
  1. En primer lugar, crea un objeto de cliente y rellenará con el cliente.
  2. Se crea una instancia de la grabadora en cola de COrder mediante la función GetObject con el moniker especificado.
  3. Se invoca el método AddOrder. La grabadora QC, se comporta como un COrder toma en el objeto de cliente, que obtiene su Class_WriteProperties llama de función para que se conserva su estado, junto con los demás parámetros (ItemID e importe).
  4. La instancia de grabadora COrder se establece en nothing. En este punto, todas las llamadas invocadas (sólo el AddOrder en este caso) se empaquetan junto con el token de seguridad de cliente y otra información ajustado en un mensaje de Message Queue Server (MSMQ) y envía al destino.
  5. Tener terminado su trabajo, el cliente destruye la instancia de cliente y finaliza su trabajo.

    Mientras tanto...

  6. Una vez enviado el mensaje, debe suponer que finalmente llega a cola de la aplicación deseada.
  7. Porque la aplicación estaba establecida como "escucha" para los mensajes, detecta la llegada del mensaje MSMQ y averigua que pertenece un COrder clase utilizada por el usuario X . Después de realizar acceso comprobaciones, crea una instancia de COrder en el servidor.
  8. Ahora empieza la parte de "reproducción" de la narración. El Reproductor QC inicia invocar los métodos la grabadora de almacenados en el mensaje.
  9. En este caso, es el método de AddOrder. Sin embargo, dado que los parámetros incluyen un objeto de cliente, primero se crea una instancia de CCustomer con y se dirige a "cargar" Sí a través de la Class_ReadProperties función.
  10. Una vez cargada la instancia, el Reproductor realmente llama al método AddOrder en el objeto COrder real, para que lo sus tareas. Pasa la nueva instancia de cliente como el argumento de llamada y una vez realizada la llamada, destruye la instancia temporal. Se invoca a continuación, ninguna otra llamada grabada de forma similar y, a continuación, libera el objeto COrder y temporales CCustomer con instancias.
El código de COrder ejecutado sin darse cuenta que la instancia de cliente se utiliza realmente fue una instancia local diferente del objeto de cliente que sí almacenado en el cliente, quizá minutos o hace horas. En este modo, se mantiene el modelo asincrónico todo.

Propiedades

Id. de artículo: 246627 - Última revisión: domingo, 23 de febrero de 2014 - Versión: 2.7
La información de este artículo se refiere a:
  • Microsoft Visual Studio 6.0 Enterprise
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
Palabras clave: 
kbnosurvey kbarchive kbmt kbcomplusqc kbhowto KB246627 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 246627

Enviar comentarios

 

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