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.
Argomenti correlati