Pergunta

Eu estou escrevendo um serviço do Windows que puxa mensagens de um MSMQ e mensagens-los a um sistema legado (Baan). Se o pós falhar ou a máquina vai para baixo durante o post, eu não quero perder a mensagem. Por isso, estou usando transações MSMQ. I abortar em caso de falha, e eu cometer em caso de sucesso.

Ao trabalhar contra uma fila local, este código funciona bem. Mas na produção vou querer separar a máquina (ou máquinas) executar o serviço a partir da própria fila. Quando eu testar contra uma fila remota, uma System.Messaging.MessageQueueException é jogado: "O uso de transação é inválido"

Tenho verificado que a fila em questão é transacional.

Aqui está o código que recebe da fila:

// 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;

Resposta

Eu tenho uma vez mudou para SQL Service Broker . Ele suporta remoto transacional receber, enquanto MSMQ 3.0 não. E, como um bônus adicional, já usa a instância do SQL Server que agrupar e fazer backup.

Foi útil?

Solução

Eu deixei um comentário perguntando sobre a versão do MSMQ que você está usando, como eu acho que esta é a causa do seu problema. Transacional Receba não foi implementado nas versões anteriores do MSMQ. Se for esse o caso, então este blog explica as suas opções.

Outras dicas

Usando o TransactionScope deve funcionar desde que o MSDTC está em execução em ambas as máquinas.

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

Eu tenho uma vez mudou para SQL Service Broker . Ele suporta remoto transacional receber, enquanto MSMQ 3.0 não. E, como um bônus adicional, já usa a instância do SQL Server que agrupar e fazer backup.

A fim de âmbito utilização Transação você deve antes verificar se MSDTC está intalled e conexão cliente remoto foi ativado.

Instale MSDTC não é um problema, mas ativar conexão do cliente remoto deve causar a reinicialização do servidor (no servidor Windows 2003 este for o caso).

talvez este post pode ajudá-lo: Como ativar MSDTC e remota conexão do cliente

Aviod usando remoto MSMQ (atualização Else para MSMQ 4.0 para suportar transações MSMQ remoto). 1) Como alternativa, você pode criar um webservice para empurrar as Mensagens 2) Criar MSMQ local para fins de transação 3) Criar um pequeno utilitário que tem número pacote (lote) e messagenumbers ... Uma vez que o lote é não apagar as mensagens no alvo outra pessoa fazer isso como escopo de transação

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top