Compartir a través de


Control de errores en componentes en cola

En ocasiones, se produce una situación en la que un mensaje no se puede entregar correctamente a su destino previsto, normalmente debido a un problema con el sistema o la configuración. Por ejemplo, es posible que el mensaje se dirija a una cola que no existe o que la cola de destino no esté en un estado para recibir. El mover de mensajes es una herramienta que mueve todos los mensajes de Message Queuing con errores de una cola a otra para que se puedan reintentar. La utilidad de movimiento de mensajes es un objeto automation que se puede invocar con un VBScript.

Herramienta administrativa de Servicios de componentes

No corresponde.

Visual Basic

En el código de ejemplo siguiente se muestra cómo crear un objeto MessageMover, establecer las propiedades necesarias e iniciar la transferencia. Para usarlo desde Visual Basic, agregue una referencia a la biblioteca de tipos de servicios COM+.

Nota

Para usar el objeto MessageMover, debe tener Message Queuing instalado en el equipo y la aplicación especificada por AppName debe tener habilitada la puesta en cola. Para obtener información sobre cómo instalar Message Queuing, vea Ayuda y soporte técnico en el menú Inicio .

 

Function MyMessageMover( _
  strSource As String, _
  strDest As String _
) As Boolean  ' Return False if any errors occur.

    MyMessageMover = False  ' Initialize the function.
    On Error GoTo My_Error_Handler  ' Initialize error handling.

    Dim lngMovedMessages As Long
    Dim objMessageMover As COMSVCSLib.MessageMover
    Set objMessageMover = CreateObject("QC.MessageMover")
    objMessageMover.SourcePath = strSource
    objMessageMover.DestPath = strDest
    lngMovedMessages = objMessageMover.MoveMessages

    MsgBox lngMovedMessages & " messages moved from " & _
      strSource & " to " & strDest

    MyMessageMover = True  ' Successful end to procedure
    Set objMessageMover = Nothing
    Exit Function

My_Error_Handler:  ' Replace with specific error handling.
    MsgBox "Error # " & Err.Number & " (Hex: " & Hex(Err.Number) _
      & ")" & vbNewLine & Err.Description
    Set objMessageMover = Nothing
    lngMovedMessages = -1
End Function

El siguiente código de Visual Basic muestra cómo llamar a la función MyMessageMover.

Sub Main()
  ' Replace AppName with the name of a COM+ application.
  If Not MyMessageMover(".\private$\AppName_deadqueue", ".\AppName") Then
      MsgBox "MyMessageMover failed."
  End If
End Sub

La ruta de acceso de origen del mensaje es la cola de reposo final. Es la cola muerta, que es una cola privada de Message Queuing y se llama AppName_deadqueue. Los mensajes se mueven aquí si la transacción se anula repetidamente cuando se intenta en la quinta cola de reintento. Con la herramienta de movimiento de mensajes, puede volver a mover el mensaje a la primera cola, que se denomina AppName. Para obtener más información sobre las colas de reintento, consulte Errores del lado servidor.

Si los atributos de la cola permiten, el mover de mensajes mueve los mensajes de forma transitoria para que los mensajes no se pierdan o se dupliquen en caso de error durante el movimiento. La herramienta conserva todas las propiedades de mensaje que se pueden conservar al mover mensajes de una cola a otra.

Si los mensajes se generan mediante llamadas a componentes en cola de COM+, la utilidad de mover mensajes conserva el identificador de seguridad del autor de la llamada original a medida que mueve los mensajes entre las colas. Si las colas de destino y de origen son transaccionales, toda la operación se realiza de forma transitoria. Si las colas de origen o de destino no son transaccionales, la operación no se ejecuta bajo una transacción. Un error inesperado (como un bloqueo) y el reinicio de un movimiento no transaccional podría duplicar el mensaje que se mueve en el momento del error.

C/C++

En el código de ejemplo siguiente se muestra cómo crear un objeto MessageMover, establecer las propiedades necesarias e iniciar la transferencia. El método ErrorDescription se describe en Interpretación de códigos de error.

Nota

Para usar el objeto MessageMover, debe tener Message Queuing instalado en el equipo y la aplicación especificada por AppName debe tener habilitada la puesta en cola. Para obtener información sobre cómo instalar Message Queuing, vea Ayuda y soporte técnico en el menú Inicio .

 

#include <windows.h>
#include <stdio.h>
#import "C:\WINDOWS\system32\ComSvcs.dll"
#include "ComSvcs.h"
#include "StrSafe.h"  

BOOL MyMessageMover (OLECHAR* szSource, OLECHAR* szDest) {
    IUnknown * pUnknown = NULL;
    IMessageMover * pMover = NULL;
    HRESULT hr = S_OK;
    BSTR bstrSource = NULL;
    BSTR bstrDest = NULL;
    unsigned int uMaxLen = 255;  // Maximum length of szMyApp

try {
    // Test the input strings to make sure they're OK to use.
    hr = StringCchLengthW(szSource, uMaxLen, NULL);
    if (FAILED (hr)) throw(hr);
    hr = StringCchLengthW(szDest, uMaxLen, NULL);
    if (FAILED (hr)) throw(hr);
    
    // Convert the input strings to BSTRs.
    bstrSource = SysAllocString(szSource);
    bstrDest = SysAllocString(szDest);

    // Create a MessageMover object and get its IUnknown.
    hr = CoCreateInstance(CLSID_MessageMover, NULL, 
      CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pUnknown);
    if (FAILED (hr)) throw(hr);    

    // Get the IMessageMover interface.
    hr = pUnknown->QueryInterface(IID_IMessageMover, (void**)&pMover); 
    if (FAILED (hr)) throw(hr);

    // Put the source and destination files.
    hr = pMover->put_SourcePath(bstrSource);
    if (FAILED (hr)) throw(hr);
    hr = pMover->put_DestPath(bstrDest);
    if (FAILED (hr)) throw(hr);

    // Move the messages.
    LONG lCount = -1;
    hr = pMover->MoveMessages(&lCount);
    if (FAILED (hr)) throw(hr);
    printf("%ld messages moved from %S to %S.\n", 
      lCount, bstrSource, bstrDest);

    // Clean up.
    SysFreeString(bstrDest);
    SysFreeString(bstrSource);
    pUnknown->Release();
    pUnknown = NULL;
    pMover->Release();
    pMover = NULL;
    return (TRUE);
}  // try

catch(HRESULT hr) {  // Replace with specific error handling.
    printf("Error # %#x: ", hr);
    ErrorDescription(hr);
    SysFreeString(bstrDest);
    SysFreeString(bstrSource);
    if (NULL != pUnknown) pUnknown->Release();
    pUnknown = NULL;
    if (NULL != pMover) pMover->Release();
    pMover = NULL;
    return (FALSE);
}catch(...) {
    printf("An unexpected exception occurred.\n");
    throw;
}        
}  // MyMessageMover

El siguiente código de C++ muestra cómo llamar a la función MyMessageMover.

#include <windows.h>
#include <stdio.h>

#define _WIN32_DCOM  // To use CoInitializeEx()

void main() 
{
    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    if (FAILED (hr)) {
        printf("CoInitializeEx failed: Error # %#x\n", hr);
        exit(0);  // Replace with specific error handling.
    }
    if (! MyMessageMover(L".\\private$\\AppName_deadqueue", 
      L".\\AppName"))
        printf("MyMessageMover failed.\n");
    CoUninitialize();
}

La ruta de acceso de origen del mensaje es la cola de reposo final. Es la cola muerta, que es una cola privada de Message Queuing y se llama AppName_deadqueue. Los mensajes se mueven aquí si la transacción se anula repetidamente cuando se intenta en la quinta cola de reintento. Con la herramienta de movimiento de mensajes, puede volver a mover el mensaje a la primera cola, que se denomina AppName. Para obtener más información sobre las colas de reintento, consulte Errores del lado servidor.

Si los atributos de la cola permiten, el mover de mensajes mueve los mensajes de forma transitoria para que los mensajes no se pierdan o se dupliquen en caso de error durante el movimiento. La herramienta conserva todas las propiedades de mensaje que se pueden conservar al mover mensajes de una cola a otra.

Si los mensajes se generan mediante llamadas a componentes en cola de COM+, la utilidad de mover mensajes conserva el identificador de seguridad del autor de la llamada original a medida que mueve los mensajes entre las colas. Si las colas de destino y de origen son transaccionales, toda la operación se realiza de forma transitoria. Si las colas de origen o de destino no son transaccionales, la operación no se ejecuta bajo una transacción. Un error inesperado (como un bloqueo) y el reinicio de un movimiento no transaccional podría duplicar el mensaje que se mueve en el momento del error.

Comentarios

COM+ controla las anulaciones del lado servidor (reproductor) moviendo el mensaje que produce un error en una cola de "reposo final" diferente para salir del camino. El agente de escucha y el reproductor no pueden repetir continuamente un mensaje que anula. En muchos casos, la transacción anulada se puede corregir realizando una acción en el servidor.

Errores de componentes en cola