Zpracování chyb v komponentách zařazených do fronty

Občas dochází k situaci, kdy nelze zprávu úspěšně doručit do zamýšleného cíle, obvykle kvůli problému se systémem nebo konfigurací. Zpráva může být například směrována do fronty, která neexistuje, nebo cílová fronta nemusí být schopna přijmout zprávu. Mover zpráv je nástroj, který přesune všechny neúspěšné zprávy Řízení front zpráv z jedné fronty do jiné, aby se je mohly znovu zpracovat. Nástroj pro přesun zpráv je objekt Automation, který lze vyvolat pomocí jazyka VBScript.

Nástroj pro správu služby Components Services

Nevztahuje se.

Visual Basic

Následující ukázkový kód ukazuje, jak vytvořit objekt MessageMover, nastavit požadované vlastnosti a zahájit přenos. Pokud ho chcete použít z jazyka Visual Basic, přidejte odkaz na knihovnu typů služeb COM+.

Poznámka

Chcete-li použít MessageMover objekt, musíte mít v počítači nainstalována služba Řízení front zpráv a aplikace určená aplikací AppName musí mít povoleno řízení front. Informace o instalaci služby Řízení front zpráv naleznete v nápovědě a podpoře v nabídce 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

Následující kód jazyka Visual Basic ukazuje, jak volat funkci 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

Zdrojová cesta zprávy je konečná čekací fronta. Jedná se o mrtvou frontu, což je soukromá fronta služby Microsoft Message Queuing (MSMQ) a nazývá se AppName_deadqueue. Zprávy se sem přesunou, pokud transakce opakovaně selhává při pokusu v páté frontě pokusů. Pomocí nástroje pro přesouvání zpráv můžete zprávu přesunout zpět do první fronty, která se nazývá AppName. Další informace o frontách opakovaných pokusů najdete v tématu Server-Side Chyby.

Pokud atributy fronty umožňují, přesouvá správce zpráv zprávy dočasně, aby se neztratily nebo neduplikovaly v případě selhání během přesunu. Nástroj zachovává všechny vlastnosti zprávy, které je možné zachovat při přesouvání zpráv z jedné fronty do druhé.

Pokud jsou zprávy generovány voláním komponent s frontou COM+, nástroj pro přesouvání zpráv zachová identifikátor zabezpečení původního volajícího při přesouvání zpráv mezi frontami. Pokud jsou cílové i zdrojové fronty transakční, provede se celá operace přechodně. Pokud zdrojové nebo cílové fronty nejsou transakční, operace neprobíhá jako transakce. Neočekávané selhání (například pád systému) a restartování ne-transakčního přesunu může způsobit, že zpráva je během selhání duplikována.

C/C++

Následující ukázkový kód ukazuje, jak vytvořit objekt MessageMover, nastavit požadované vlastnosti a zahájit přenos. Metoda ErrorDescription je popsána v Interpretování kódů chyb.

Poznámka

Chcete-li použít MessageMover objekt, musíte mít v počítači nainstalována služba Řízení front zpráv a aplikace určená aplikací AppName musí mít povoleno řízení front. Informace o instalaci služby Řízení front zpráv naleznete v nápovědě a podpoře v nabídce 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

Následující kód jazyka C++ ukazuje, jak volat funkci 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();
}

Zdrojová cesta zprávy je konečná cílová fronta. Jedná se o mrtvou frontu, což je soukromá fronta Message Queuing a nazývá se AppName_deadqueue. Zprávy se sem přesunou, pokud transakce opakovaně selžou ve frontě pro páté opakování transakce. Pomocí nástroje pro přesouvání zpráv můžete zprávu přesunout zpět do první fronty, která se nazývá AppName. Další informace o frontách opakování najdete v tématu Server-Side Chyby.

Pokud atributy fronty umožňují, jsou zprávy přesouvány přechodovým způsobem, aby se zprávy neztratily ani neduplikovaly při selhání během přesunu. Nástroj zachovává všechny vlastnosti zprávy, které je možné zachovat při přesouvání zpráv z jedné fronty do druhé.

Pokud jsou zprávy generovány voláním frontovaných komponent COM+, nástroj pro přesun zpráv zachovává identifikátor zabezpečení původního volajícího při přesouvání zpráv mezi frontami. Pokud jsou cílové i zdrojové fronty transakční, provede se celá operace přechodně. Pokud zdrojové nebo cílové fronty nejsou transakční, operace se nespustí v rámci transakce. Neočekávané selhání (například pád systému) a restartování netransakčního přesunu mohlo způsobit duplikaci zprávy, která byla přemisťována v době selhání.

Poznámky

COM+ zpracovává serverová přerušení přesunem selhávající zprávy do jiné "konečné odpočinkové" fronty, aby se dostala z cesty. Posluchač a přehrávač nemohou neustále opakovat zprávu, která se zruší. V mnoha případech lze přerušenou transakci opravit provedením akce na serveru.

Chyby komponent ve frontě