Udostępnij przez


Obsługa błędów w kolejkowanych składnikach

Czasami występuje sytuacja, w której komunikat nie może zostać pomyślnie dostarczony do zamierzonego miejsca docelowego, zwykle z powodu problemu z systemem lub konfiguracją. Na przykład komunikat może być kierowany do kolejki, która nie istnieje, lub kolejka docelowa może nie znajdować się w stanie do odebrania. Mover komunikatów jest narzędziem, które przenosi wszystkie nieudane kolejkowania komunikatów z jednej kolejki do innej, aby można było je ponowić. Narzędzie do przenoszenia komunikatów jest obiektem automatyzacji, który można wywołać za pomocą VBScript.

Narzędzie administracyjne usług składników

Nie ma zastosowania.

Visual Basic

Poniższy przykładowy kod pokazuje, jak utworzyć obiekt MessageMover, ustawić wymagane właściwości i zainicjować transfer. Aby użyć go z poziomu języka Visual Basic, dodaj odwołanie do biblioteki typów usług COM+.

Notatka

Aby użyć obiektu MessageMover, na komputerze musi być zainstalowane Kolejkowanie komunikatów, a aplikacja określona przez AppName musi mieć włączone kolejkowanie. Aby uzyskać informacje na temat instalowania kolejkowania komunikatów, zobacz Pomoc i obsługa techniczna w menu Start .

 

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

Poniższy kod języka Visual Basic pokazuje, jak wywołać funkcję 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

Ścieżka źródłowa komunikatu jest ostatnią kolejką spoczynku. Jest to kolejka martwa, która jest prywatną kolejką kolejkowania komunikatów i jest nazywana AppName_deadqueue. Komunikaty są przenoszone w tym miejscu, jeśli transakcja wielokrotnie przerywa się podczas próby w piątej kolejce ponawiania prób. Za pomocą narzędzia do przenoszenia komunikatów można przenieść komunikat z powrotem do pierwszej kolejki, która nosi nazwę AppName. Aby uzyskać więcej informacji na temat kolejek ponawiania prób, zobacz błędy Server-Side.

Jeśli atrybuty kolejki na to pozwalają, przesuwacz komunikatów przenosi je przejściowo, aby nie zostały utracone ani zduplikowane w przypadku awarii podczas przenoszenia. Narzędzie zachowuje wszystkie właściwości komunikatu, które można zachować podczas przenoszenia komunikatów z jednej kolejki do innej.

Jeśli komunikaty są generowane przez wywołania składników COM+ w kolejce, narzędzie do przenoszenia komunikatów zachowuje identyfikator bezpieczeństwa oryginalnego wywołującego podczas przesyłania komunikatów między kolejkami. Jeśli kolejki docelowe i źródłowe są transakcyjne, cała operacja jest wykonywana przejściowo. Jeśli kolejki źródłowe lub docelowe nie są transakcyjne, operacja nie jest wykonywana w ramach transakcji. Nieoczekiwana awaria i ponowne uruchomienie operacji nie-transakcyjnej może spowodować zduplikowanie komunikatu w momencie awarii.

C/C++

Poniższy przykładowy kod pokazuje, jak utworzyć obiekt MessageMover, ustawić wymagane właściwości i zainicjować transfer. Metoda ErrorDescription została opisana w Interpretowanie kodów błędów.

Notatka

Aby użyć obiektu MessageMover, na komputerze musi być zainstalowana usługa Kolejkowania Komunikatów, a aplikacja wskazana przez AppName musi mieć włączoną opcję kolejkowania. Aby uzyskać informacje na temat instalowania kolejkowania komunikatów, zobacz Pomoc i obsługa techniczna w menu Start .

 

#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

Poniższy kod języka C++ pokazuje, jak wywołać funkcję 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();
}

Ścieżka źródłowa komunikatu jest ostatnią kolejką spoczynku. Jest to kolejka martwa, która jest prywatną kolejką kolejkowania komunikatów i jest nazywana AppName_deadqueue. Komunikaty są przenoszone w tym miejscu, jeśli transakcja wielokrotnie przerywa się podczas próby w piątej kolejce ponawiania prób. Za pomocą narzędzia do przenoszenia wiadomości możesz przenieść wiadomość z powrotem do pierwszej kolejki o nazwie AppName. Aby uzyskać więcej informacji na temat kolejek ponawiania prób, zobacz błędy Server-Side.

Jeśli atrybuty kolejki zezwalają, przenosiciel wiadomości przemieszcza wiadomości w sposób przejściowy, tak aby podczas awarii w trakcie przenoszenia wiadomości nie zostały utracone lub zduplikowane. Narzędzie zachowuje wszystkie właściwości komunikatu, które można zachować podczas przenoszenia komunikatów z jednej kolejki do innej.

Jeśli komunikaty są generowane przez wywołania Kolejkowanych Składników COM+, narzędzie przesuwania komunikatów zachowuje identyfikator zabezpieczeń oryginalnego wywołującego podczas przesyłania komunikatów między kolejkami. Jeśli kolejki docelowe i źródłowe są transakcyjne, cała operacja jest wykonywana przejściowo. Jeśli kolejki źródłowe lub docelowe nie są transakcyjne, operacja nie jest wykonywana w ramach transakcji. Nieoczekiwany błąd (taki jak awaria) i ponowne uruchomienie operacji przeniesienia nietransakcyjnego może spowodować zduplikowanie komunikatu przenoszonego podczas wystąpienia awarii.

Uwagi

COM+ obsługuje przerwania po stronie serwera (gracza) poprzez przeniesienie komunikatu, który kończy się niepowodzeniem, do innej "ostatecznej" kolejki, aby usunąć problem z drogi. Odbiornik i odtwarzacz nie mogą stale zapętlać komunikatu, który zostaje przerwany. W wielu przypadkach przerwana transakcja może zostać naprawiona przez podjęcie akcji na serwerze.

Błędy kolejkowanych składników