キューに登録されたコンポーネントでのエラーの処理

場合によっては、通常はシステムまたは構成の問題が原因で、メッセージを目的の宛先に正常に配信できないことがあります。 たとえば、メッセージが存在しないキューに送られたり、宛先キューが受信する状態ではない可能性があります。 メッセージ ムーバーは、失敗したすべてのメッセージ キュー メッセージを 1 つのキューから別のキューに移動して再試行できるようにするツールです。 メッセージ ムーバー ユーティリティは、VBScript を使って呼び出すことができるオートメーション オブジェクトです。

コンポーネント サービス管理ツール

適用されません。

Visual Basic

次のサンプル コードは、MessageMover オブジェクトを作成して、必要なプロパティを設定し、転送を開始する方法を示しています。 Visual Basic から使用するには、COM+ サービス タイプ ライブラリへの参照を追加します。

Note

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 と呼ばれるデッド キューです。 5 番目の再試行キューで試行されたときにトランザクションが繰り返し中止した場合、メッセージはここに移動されます。 メッセージ ムーバー ツールを使用すると、AppName と呼ばれる最初のキューにメッセージを戻すことができます。 再試行キューについて詳しくは、「サーバー側エラー」をご覧ください。

キュー属性が許可されている場合、メッセージ ムーバーは、移動中に障害が発生した場合にメッセージが失われたり重複したりしないように、メッセージを遷移的に移動します。 このツールは、あるキューから別のキューにメッセージを移動するときに保持できるすべてのメッセージ プロパティを保持します。

メッセージが COM+ キューに登録されたコンポーネント呼び出しによって生成される場合、メッセージ ムーバー ユーティリティは、キュー間でメッセージを移動する際に元の呼び出し元のセキュリティ識別子を保持します。 宛先キューとソース キューの両方がトランザクションである場合、操作全体が遷移的に実行されます。 ソース キューまたは宛先キューのいずれかがトランザクションでない場合、その操作はトランザクションでは実行されません。 予期しないエラー (クラッシュなど) と非トランザクション移動の再起動によって、エラー発生時に移動されるメッセージが複製される可能性があります。

C/C++

次のサンプル コードは、MessageMover オブジェクトを作成して、必要なプロパティを設定し、転送を開始する方法を示しています。 ErrorDescription メソッドについては、「エラー コードの解釈」をご覧ください。

Note

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 と呼ばれるデッド キューです。 5 番目の再試行キューで試行されたときにトランザクションが繰り返し中止した場合、メッセージはここに移動されます。 メッセージ ムーバー ツールを使用すると、AppName と呼ばれる最初のキューにメッセージを戻すことができます。 再試行キューについて詳しくは、「サーバー側エラー」をご覧ください。

キュー属性が許可されている場合、メッセージ ムーバーは、移動中に障害が発生した場合にメッセージが失われたり重複したりしないように、メッセージを遷移的に移動します。 このツールは、あるキューから別のキューにメッセージを移動するときに保持できるすべてのメッセージ プロパティを保持します。

メッセージが COM+ キューに登録されたコンポーネント呼び出しによって生成される場合、メッセージ ムーバー ユーティリティは、キュー間でメッセージを移動する際に元の呼び出し元のセキュリティ識別子を保持します。 宛先キューとソース キューの両方がトランザクションである場合、操作全体が遷移的に実行されます。 ソース キューまたは宛先キューのいずれかがトランザクションでない場合、その操作はトランザクションでは実行されません。 予期しないエラー (クラッシュなど) と非トランザクション移動の再起動によって、エラー発生時に移動されるメッセージが複製される可能性があります。

解説

COM+ は、障害が発生しているメッセージを別の "最後の休止" キューに移動することにより、サーバー側 (プレーヤー) の中止を処理し、途中で停止します。 リスナーとプレーヤーは、中止したメッセージを継続的にループすることはできません。 多くの場合、中止されたトランザクションは、サーバーでアクションを実行することにより修正できます。

キューに登録されたコンポーネントのエラー