Question

J'écris un service Windows qui extrait les messages d'un MSMQ et les publie sur un système hérité (Baan). Si la publication échoue ou si la machine tombe en panne pendant la publication, je ne veux pas perdre le message. J'utilise donc les transactions MSMQ. J'avorte en cas d'échec et je m'engage en cas de succès.

Lorsque vous travaillez sur une file d'attente locale, ce code fonctionne bien. Mais en production, je souhaiterai séparer la machine (ou les machines) exécutant le service de la file d'attente elle-même. Lorsque je teste une file d'attente distante, une exception System.Messaging.MessageQueueException est générée: "L'utilisation de la transaction n'est pas valide."

J'ai vérifié que la file d'attente en question est transactionnelle.

Voici le code reçu de la file d'attente:

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

Répondre

Depuis, je suis passé à SQL Service Broker . Il prend en charge la réception transactionnelle à distance, contrairement à MSMQ 3.0. De plus, il utilise déjà l’instance SQL Server que nous regroupons et sauvegardons.

Était-ce utile?

La solution

J'ai laissé un commentaire sur la version de MSMQ que vous utilisez, car je pense que c'est la cause de votre problème. La réception transactionnelle n'a pas été implémentée dans les versions antérieures de MSMQ. Si tel est le cas, cette l'article de blog explique vos options.

Autres conseils

L'utilisation de TransactionScope devrait fonctionner à condition que le MSDTC s'exécute sur les deux ordinateurs.

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

Depuis, je suis passé à SQL Service Broker . Il prend en charge la réception transactionnelle à distance, contrairement à MSMQ 3.0. De plus, il utilise déjà l’instance SQL Server que nous regroupons et sauvegardons.

Pour utiliser la portée de Transaction, vous devez au préalable vérifier que MSDTC est installé et que la connexion du client distant a été activée.

L’installation de MSDTC n’est pas un problème mais l’activation de la connexion client à distance doit provoquer le redémarrage du serveur (sur Windows Server 2003, c’est le cas).

peut-être que cet article peut vous aider: Comment activer MSDTC et la télécommande connexion client

Aviod utilisant MSMQ distant (sinon mise à niveau vers MSMQ 4.0 pour prendre en charge la transaction MSMQ distante). 1) Vous pouvez également créer un service Web pour envoyer les messages. 2) Créer une MSMQ locale à des fins de transaction 3) Créez un petit utilitaire ayant un numéro de lot (lot) et des numéros de messagerie ... Une fois que le lot a échoué, supprimez les messages sur la cible, sinon définissez-le comme étendue de la transaction

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top