Обработка ошибок в очередях компонентов
Иногда возникает ситуация, в которой сообщение не может быть успешно доставлено в его предполагаемое назначение, как правило, из-за проблемы с системой или конфигурацией. Например, сообщение может быть перенаправлено в очередь, которая не существует, или целевая очередь может не находиться в состоянии получения. Перемещение сообщений — это средство, которое перемещает все сообщения очереди сообщений из одной очереди в другую, чтобы их можно было извлечь. Служебная программа перемещения сообщений — это объект автоматизации, который можно вызвать с помощью VBScript.
Средство Администратор istrative Services
Не применяется.
Visual Basic
В следующем примере кода показано, как создать объект MessageMover, задать необходимые свойства и инициировать передачу. Чтобы использовать его из Visual Basic, добавьте ссылку на библиотеку типов служб COM+ .
Примечание.
Чтобы использовать объект MessageMover, необходимо установить очередь сообщений на компьютере, а приложение, указанное appName, должно включить очередь. Сведения об установке очереди сообщений см. в меню "Справка и поддержка".
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
В следующем коде Visual Basic показано, как вызвать функцию 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
Исходный путь сообщения — это окончательная очередь отдыха. Это недоставленная очередь, которая является частной очередью очереди сообщений и вызывается AppName_deadqueue. Сообщения перемещаются здесь, если транзакция неоднократно прерывается при попытке в пятой очереди повторных попыток. С помощью средства перемещения сообщений можно переместить сообщение обратно в первую очередь, которая называется AppName. Дополнительные сведения о очередях повторных попыток см. в разделе "Ошибки на стороне сервера".
Если разрешены атрибуты очереди, перемещение сообщений перемещает сообщения в переходный режим, чтобы сообщения не были потеряны или дублируются в случае сбоя во время перемещения. Средство сохраняет все свойства сообщения, которые можно сохранить при перемещении сообщений из одной очереди в другую.
Если сообщения создаются вызовами com+ Queued Components, программа перемещения сообщений сохраняет идентификатор безопасности исходного вызывающего объекта при перемещении сообщений между очередями. Если конечные и исходные очереди являются транзакциями, все операции выполняются переходно. Если исходные или целевые очереди не являются транзакциями, операция не выполняется под транзакцией. Непредвиденный сбой (например, сбой) и перезапуск перемещения, отличного от транзакций, может дублировать сообщение во время сбоя.
C/C++
В следующем примере кода показано, как создать объект MessageMover, задать необходимые свойства и инициировать передачу. Метод ErrorDescription описан при интерпретации кодов ошибок.
Примечание.
Чтобы использовать объект MessageMover, необходимо установить очередь сообщений на компьютере, а приложение, указанное appName, должно включить очередь. Сведения об установке очереди сообщений см. в меню "Справка и поддержка".
#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
В следующем коде C++ показано, как вызвать функцию 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();
}
Исходный путь сообщения — это окончательная очередь отдыха. Это недоставленная очередь, которая является частной очередью очереди сообщений и вызывается AppName_deadqueue. Сообщения перемещаются здесь, если транзакция неоднократно прерывается при попытке в пятой очереди повторных попыток. С помощью средства перемещения сообщений можно переместить сообщение обратно в первую очередь, которая называется AppName. Дополнительные сведения о очередях повторных попыток см. в разделе "Ошибки на стороне сервера".
Если разрешены атрибуты очереди, перемещение сообщений перемещает сообщения в переходный режим, чтобы сообщения не были потеряны или дублируются в случае сбоя во время перемещения. Средство сохраняет все свойства сообщения, которые можно сохранить при перемещении сообщений из одной очереди в другую.
Если сообщения создаются вызовами com+ Queued Components, программа перемещения сообщений сохраняет идентификатор безопасности исходного вызывающего объекта при перемещении сообщений между очередями. Если конечные и исходные очереди являются транзакциями, все операции выполняются переходно. Если исходные или целевые очереди не являются транзакциями, операция не выполняется под транзакцией. Непредвиденный сбой (например, сбой) и перезапуск перемещения, отличного от транзакций, может дублировать сообщение во время сбоя.
Замечания
COM+ обрабатывает прерывания на стороне сервера (проигрывателя), переместив сообщение, которое завершается сбоем в другую очередь "окончательного отдыха", чтобы выйти из пути. Прослушиватель и проигрыватель не могут постоянно циклически выполняться в сообщении, прерванном. Во многих случаях прерванная транзакция может быть исправлена путем принятия действий на сервере.
См. также