Condividi tramite


Gestione degli errori nei componenti in coda

In alcuni casi, si verifica una situazione in cui un messaggio non può essere recapitato correttamente alla destinazione desiderata, in genere a causa di un problema con il sistema o la configurazione. Ad esempio, il messaggio potrebbe essere indirizzato a una coda che non esiste o la coda di destinazione potrebbe non essere in uno stato da ricevere. Lo strumento di spostamento dei messaggi è uno strumento che sposta tutti i messaggi di accodamento messaggi non riusciti da una coda a un'altra in modo che possano essere ritentati. L'utilità di spostamento dei messaggi è un oggetto di Automazione che può essere richiamato con vbScript.

Strumento di Amministrazione istrative components Services

Non è valida.

Visual Basic

Il codice di esempio seguente illustra come creare un oggetto MessageMover, impostare le proprietà necessarie e avviare il trasferimento. Per usarlo da Visual Basic, aggiungere un riferimento alla libreria dei tipi di servizi COM+.

Nota

Per utilizzare l'oggetto MessageMover, è necessario che nel computer sia installato Accodamento messaggi e che l'applicazione specificata da AppName disponga dell'accodamento abilitato. Per informazioni sull'installazione di Accodamento messaggi, vedere Guida e supporto nel 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

Nel codice Visual Basic seguente viene illustrato come chiamare la funzione 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

Il percorso di origine del messaggio è la coda di riposo finale. È la coda dei messaggi non recapitabili, ovvero una coda di accodamento messaggi privata e viene chiamata AppName_deadqueue. I messaggi vengono spostati qui se la transazione viene interrotta ripetutamente quando viene tentata la quinta coda di tentativi. Con lo strumento di spostamento dei messaggi, è possibile spostare nuovamente il messaggio nella prima coda, denominata AppName. Per altre informazioni sulle code di ripetizione dei tentativi, vedere Errori sul lato server.

Se gli attributi della coda sono consentiti, lo spostamento dei messaggi viene spostato in modo transitorio in modo che i messaggi non vengano persi o duplicati in caso di errore durante lo spostamento. Lo strumento mantiene tutte le proprietà del messaggio che possono essere mantenute durante lo spostamento di messaggi da una coda a un'altra.

Se i messaggi vengono generati dalle chiamate di COM+ Queued Components, l'utilità di spostamento dei messaggi mantiene l'identificatore di sicurezza del chiamante originale durante lo spostamento dei messaggi tra le code. Se entrambe le code di destinazione e di origine sono transazionali, l'intera operazione viene eseguita in modo transitorio. Se le code di origine o di destinazione non sono transazionali, l'operazione non viene eseguita in una transazione. Un errore imprevisto(ad esempio un arresto anomalo) e il riavvio di uno spostamento non transazionale potrebbe duplicare il messaggio spostato al momento dell'errore.

C/C++

Il codice di esempio seguente illustra come creare un oggetto MessageMover, impostare le proprietà necessarie e avviare il trasferimento. Il metodo ErrorDescription è descritto in Interpretazione dei codici di errore.

Nota

Per utilizzare l'oggetto MessageMover, è necessario che nel computer sia installato Accodamento messaggi e che l'applicazione specificata da AppName disponga dell'accodamento abilitato. Per informazioni sull'installazione di Accodamento messaggi, vedere Guida e supporto nel 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

Il codice C++ seguente illustra come chiamare la funzione 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();
}

Il percorso di origine del messaggio è la coda di riposo finale. È la coda dei messaggi non recapitabili, ovvero una coda di accodamento messaggi privata e viene chiamata AppName_deadqueue. I messaggi vengono spostati qui se la transazione viene interrotta ripetutamente quando viene tentata la quinta coda di tentativi. Con lo strumento di spostamento dei messaggi, è possibile spostare nuovamente il messaggio nella prima coda, denominata AppName. Per altre informazioni sulle code di ripetizione dei tentativi, vedere Errori sul lato server.

Se gli attributi della coda sono consentiti, lo spostamento dei messaggi viene spostato in modo transitorio in modo che i messaggi non vengano persi o duplicati in caso di errore durante lo spostamento. Lo strumento mantiene tutte le proprietà del messaggio che possono essere mantenute durante lo spostamento di messaggi da una coda a un'altra.

Se i messaggi vengono generati dalle chiamate di COM+ Queued Components, l'utilità di spostamento dei messaggi mantiene l'identificatore di sicurezza del chiamante originale durante lo spostamento dei messaggi tra le code. Se entrambe le code di destinazione e di origine sono transazionali, l'intera operazione viene eseguita in modo transitorio. Se le code di origine o di destinazione non sono transazionali, l'operazione non viene eseguita in una transazione. Un errore imprevisto(ad esempio un arresto anomalo) e il riavvio di uno spostamento non transazionale potrebbe duplicare il messaggio spostato al momento dell'errore.

Osservazioni:

COM+ gestisce l'interruzione lato server (lettore) spostando il messaggio che non riesce in una diversa coda di "riposo finale", per uscire dalla strada. Il listener e il lettore non possono continuamente eseguire cicli su un messaggio che interrompe. In molti casi, la transazione interrotta può essere risolta eseguendo un'azione sul server.

Errori dei componenti in coda