Como faço para usar um MSMQ remoto transacional?
-
02-07-2019 - |
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 ??h2>
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.
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