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.
Zugehörige Themen