Поделиться через


Обработка ошибок в очередях компонентов

Иногда возникает ситуация, в которой сообщение не может быть успешно доставлено в его предполагаемое назначение, как правило, из-за проблемы с системой или конфигурацией. Например, сообщение может быть перенаправлено в очередь, которая не существует, или целевая очередь может не находиться в состоянии получения. Перемещение сообщений — это средство, которое перемещает все сообщения очереди сообщений из одной очереди в другую, чтобы их можно было извлечь. Служебная программа перемещения сообщений — это объект автоматизации, который можно вызвать с помощью 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+ обрабатывает прерывания на стороне сервера (проигрывателя), переместив сообщение, которое завершается сбоем в другую очередь "окончательного отдыха", чтобы выйти из пути. Прослушиватель и проигрыватель не могут постоянно циклически выполняться в сообщении, прерванном. Во многих случаях прерванная транзакция может быть исправлена путем принятия действий на сервере.

Ошибки компонентов в очереди