큐에 대기 중인 구성 요소의 오류 처리
경우에 따라 일반적으로 시스템 또는 구성 문제로 인해 메시지를 의도한 대상으로 성공적으로 배달할 수 없는 상황이 발생합니다. 예를 들어 메시지가 존재하지 않는 큐로 전달되거나 대상 큐가 수신할 상태가 아닐 수 있습니다. 메시지 이동기는 실패한 모든 메시지 큐 메시지를 한 큐에서 다른 큐로 이동하여 다시 시도하도록 하는 도구입니다. 메시지 이동기 유틸리티는 VBScript를 사용하여 호출할 수 있는 Automation 개체입니다.
Components 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+ 큐에 대기 중인 구성 요소 호출에 의해 메시지가 생성되는 경우 메시지 이동기 유틸리티는 큐 간에 메시지를 이동할 때 원래 호출자의 보안 식별자를 유지합니다. 대상 큐와 원본 큐가 모두 트랜잭션인 경우 전체 작업이 전환됩니다. 원본 또는 대상 큐가 트랜잭션이 아닌 경우 트랜잭션에서 작업이 실행되지 않습니다. 예기치 않은 오류(예: 크래시) 및 트랜잭션이 아닌 이동을 다시 시작하면 실패 시 이동 중인 메시지가 중복될 수 있습니다.
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+ 큐에 대기 중인 구성 요소 호출에 의해 메시지가 생성되는 경우 메시지 이동기 유틸리티는 큐 간에 메시지를 이동할 때 원래 호출자의 보안 식별자를 유지합니다. 대상 큐와 원본 큐가 모두 트랜잭션인 경우 전체 작업이 전환됩니다. 원본 또는 대상 큐가 트랜잭션이 아닌 경우 트랜잭션에서 작업이 실행되지 않습니다. 예기치 않은 오류(예: 크래시) 및 트랜잭션이 아닌 이동을 다시 시작하면 실패 시 이동 중인 메시지가 중복될 수 있습니다.
설명
COM+는 다른 "최종 휴식" 큐에 실패하는 메시지를 이동하여 서버 쪽(플레이어) 중단을 처리하여 중단을 방지합니다. 수신기와 플레이어는 중단되는 메시지를 계속 반복할 수 없습니다. 대부분의 경우 서버에서 작업을 수행하여 중단된 트랜잭션을 수정할 수 있습니다.
관련 항목