문제

MSMQ에서 메시지를 가져 와서 레거시 시스템 (BAAN)에 게시하는 Windows 서비스를 작성하고 있습니다. 게시물이 실패하거나 게시물 중에 기계가 내려 가면 메시지를 풀고 싶지 않습니다. 따라서 MSMQ 트랜잭션을 사용하고 있습니다. 나는 실패를 중단하고 성공을 약속합니다.

로컬 대기열에 대항 할 때이 코드는 잘 작동합니다. 그러나 생산에서 나는 큐 자체에서 서비스를 실행하는 기계 (또는 기계)를 분리하고 싶을 것입니다. 원격 대기열에 대해 테스트하면 System.Messaging.MessageQueueException이 발생합니다. "거래 사용이 유효하지 않습니다."

문제의 대기열이 트랜잭션인지 확인했습니다.

대기열에서받는 코드는 다음과 같습니다.

// Begin a transaction.
_currentTransaction = new MessageQueueTransaction();
_currentTransaction.Begin();

Message message = queue.Receive(wait ? _queueTimeout : TimeSpan.Zero, _currentTransaction);
_logger.Info("Received a message on queue {0}: {1}.", queue.Path, message.Label);
WORK_ITEM item = (WORK_ITEM)message.Body;
return item;

대답

나는 그 후 전환했다 SQL 서비스 브로커. MSMQ 3.0은 원격 트랜잭션 수신을 지원하지만 MSMQ 3.0은 그렇지 않습니다. 또한 추가 보너스로 이미 클러스터하고 백업하는 SQL Server 인스턴스를 사용합니다.

도움이 되었습니까?

해결책

나는 이것이 당신의 문제의 원인이라고 생각하기 때문에 당신이 사용하고있는 MSMQ 버전에 대해 묻는 의견을 남겼습니다. 트랜잭션 수신은 이전 버전의 MSMQ에서 구현되지 않았습니다. 그렇다면이 경우입니다 블로그 게시물 옵션을 설명합니다.

다른 팁

MSDTC가 두 기계에서 실행중인 경우 TransactionScope를 사용해야합니다.

MessageQueue queue = new MessageQueue("myqueue");
using (TransactionScope tx = new TransactionScope()) {
    Message message = queue.Receive(MessageQueueTransactionType.Automatic);
    tx.Complete();
}

나는 그 후 전환했다 SQL 서비스 브로커. MSMQ 3.0은 원격 트랜잭션 수신을 지원하지만 MSMQ 3.0은 그렇지 않습니다. 또한 추가 보너스로 이미 클러스터하고 백업하는 SQL Server 인스턴스를 사용합니다.

트랜잭션 범위를 사용하려면 MSDTC가 강화되어 원격 클라이언트 연결이 활성화되었는지 확인하기 전에해야합니다.

MSDTC 설치는 문제가되지 않지만 원격 클라이언트 연결을 활성화하면 서버의 재부팅이 발생해야합니다 (Windows Server 2003에서는 그렇습니다).

이 게시물이 도움이 될 수 있습니다.MSDTC 및 원격 클라이언트 연결을 활성화하는 방법

원격 MSMQ를 사용하는 AVIOD (원격 MSMQ 트랜잭션을 지원하기 위해 MSMQ 4.0으로 업그레이드). 1) 또는 메시지를 푸시하기 위해 하나의 웹 서비스를 생성 할 수 있습니다. 트랜잭션 범위로

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top