Freigeben über


Behandeln von Fehlern in komponenten in der Warteschlange

Gelegentlich tritt eine Situation auf, in der eine Nachricht nicht erfolgreich an das beabsichtigte Ziel übermittelt werden kann, in der Regel aufgrund eines Problems mit dem System oder der Konfiguration. Beispielsweise kann die Nachricht an eine Warteschlange weitergeleitet werden, die nicht vorhanden ist, oder die Zielwarteschlange befindet sich möglicherweise nicht in einem zu empfangenden Zustand. Der Message Mover ist ein Tool, das alle fehlerhaften Message Queuing-Nachrichten von einer Warteschlange in eine andere verschiebt, damit sie erneut ausgeführt werden können. Das Nachrichtenverschiebungsprogramm ist ein Automation-Objekt, das mit einem VBScript aufgerufen werden kann.

Verwaltungstool für Komponentendienste

Nicht anwendbar.

Visual Basic

Der folgende Beispielcode zeigt, wie Sie ein MessageMover-Objekt erstellen, die erforderlichen Eigenschaften festlegen und die Übertragung initiieren. Um sie in Visual Basic zu verwenden, fügen Sie einen Verweis auf die COM+-Diensttypbibliothek hinzu.

Hinweis

Um das MessageMover-Objekt verwenden zu können, muss Message Queuing auf Ihrem Computer installiert sein, und für die von AppName angegebene Anwendung muss Warteschlangen aktiviert sein. Informationen zum Installieren von Message Queuing finden Sie unter Hilfe und Support im Startmenü .

 

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

Der folgende Visual Basic-Code zeigt, wie Die Funktion MyMessageMover aufgerufen wird.

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

Der Quellpfad der Nachricht ist die letzte Ruhewarteschlange. Dabei handelt es sich um die Warteschlange für tote Dateien, bei der es sich um eine private Message Queuing-Warteschlange handelt und als AppName_deadqueue bezeichnet wird. Nachrichten werden hierher verschoben, wenn die Transaktion beim Versuch in der fünften Wiederholungswarteschlange wiederholt abgebrochen wird. Mit dem Message Mover-Tool können Sie die Nachricht zurück in die erste Warteschlange verschieben, die als AppName bezeichnet wird. Weitere Informationen zu Wiederholungswarteschlangen finden Sie unter Serverseitige Fehler.

Wenn Warteschlangenattribute dies zulassen, verschiebt der Nachrichten mover Nachrichten vorübergehend, sodass Nachrichten im Falle eines Fehlers während der Verschiebung nicht verloren gehen oder dupliziert werden. Das Tool behält alle Nachrichteneigenschaften bei, die beim Verschieben von Nachrichten aus einer Warteschlange in eine andere beibehalten werden können.

Wenn die Nachrichten von COM+ Queued Components-Aufrufen generiert werden, behält das Nachrichtenverschiebungsprogramm die Sicherheits-ID des ursprünglichen Aufrufers bei, während es Nachrichten zwischen Warteschlangen verschiebt. Wenn sowohl die Ziel- als auch die Quellwarteschlange transaktional sind, wird der gesamte Vorgang übergangsweise ausgeführt. Wenn die Quell- oder Zielwarteschlangen nicht transaktional sind, wird der Vorgang nicht unter einer Transaktion ausgeführt. Ein unerwarteter Fehler (z. B. ein Absturz) und ein Neustart einer nicht transaktionalen Verschiebung können die zum Zeitpunkt des Fehlers verschobene Nachricht duplizieren.

C/C++

Der folgende Beispielcode zeigt, wie Sie ein MessageMover-Objekt erstellen, die erforderlichen Eigenschaften festlegen und die Übertragung initiieren. Die ErrorDescription-Methode wird unter Interpretieren von Fehlercodes beschrieben.

Hinweis

Um das MessageMover-Objekt verwenden zu können, muss Message Queuing auf Ihrem Computer installiert sein, und für die von AppName angegebene Anwendung muss Warteschlangen aktiviert sein. Informationen zum Installieren von Message Queuing finden Sie unter Hilfe und Support im Startmenü .

 

#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

Der folgende C++-Code zeigt, wie die MyMessageMover-Funktion aufgerufen wird.

#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();
}

Der Quellpfad der Nachricht ist die letzte Ruhewarteschlange. Dabei handelt es sich um die Warteschlange für tote Dateien, bei der es sich um eine private Message Queuing-Warteschlange handelt und als AppName_deadqueue bezeichnet wird. Nachrichten werden hierher verschoben, wenn die Transaktion beim Versuch in der fünften Wiederholungswarteschlange wiederholt abgebrochen wird. Mit dem Message Mover-Tool können Sie die Nachricht zurück in die erste Warteschlange verschieben, die als AppName bezeichnet wird. Weitere Informationen zu Wiederholungswarteschlangen finden Sie unter Serverseitige Fehler.

Wenn Warteschlangenattribute dies zulassen, verschiebt der Nachrichten mover Nachrichten vorübergehend, sodass Nachrichten im Falle eines Fehlers während der Verschiebung nicht verloren gehen oder dupliziert werden. Das Tool behält alle Nachrichteneigenschaften bei, die beim Verschieben von Nachrichten aus einer Warteschlange in eine andere beibehalten werden können.

Wenn die Nachrichten von COM+ Queued Components-Aufrufen generiert werden, behält das Nachrichtenverschiebungsprogramm die Sicherheits-ID des ursprünglichen Aufrufers bei, während es Nachrichten zwischen Warteschlangen verschiebt. Wenn sowohl die Ziel- als auch die Quellwarteschlange transaktional sind, wird der gesamte Vorgang übergangsweise ausgeführt. Wenn die Quell- oder Zielwarteschlangen nicht transaktional sind, wird der Vorgang nicht unter einer Transaktion ausgeführt. Ein unerwarteter Fehler (z. B. ein Absturz) und ein Neustart einer nicht transaktionalen Verschiebung können die zum Zeitpunkt des Fehlers verschobene Nachricht duplizieren.

Bemerkungen

COM+ verarbeitet serverseitige (Player)-Abbrüche, indem die Nachricht, die einen Fehler verursacht, in eine andere "letzte Ruhe"-Warteschlange verschoben wird, um sie aus dem Weg zu bringen. Der Listener und der Player können keine fortlaufende Schleife für eine Nachricht ausführen, die abbricht. In vielen Fällen kann die abgebrochene Transaktion durch Ausführen einer Aktion auf dem Server behoben werden.

Fehler bei Komponenten in der Warteschlange