2009-02-18 5 views
1

Ceci est un sujet à expliquer, ici je vais.MSMQ avec le problème WCF

Nous créons un programme dans lequel l'expéditeur et le récepteur du MSMQ en utilisant WCF. Nous avons mis une faute poignée très similaire comme ceci: http://msdn.microsoft.com/en-us/library/ms751472.aspx en combinaison avec http://msdn.microsoft.com/en-us/library/ms789028.aspx

Tout fonctionne très bien. Nous avons même fait des testcases qui exécutent des centaines de messages dans la file d'attente et tout est traité. Lorsque nous arrivons à 10000, nous obtenons des délais d'attente, mais la gestion des erreurs fonctionne bien, de sorte que le message est réessayé plusieurs fois et ensuite il finit dans la file d'attente de poison.

J'ai vérifié mon code et je l'ai diffusé aux autres développeurs. Le problème suivant s'est produit plus d'une fois lors de l'utilisation de la file d'attente:

Un message n'est pas correctement lu finit comme un message d'erreur (dans la classe PoisonErrorHandler). Il a toujours ce message d'exception (de type FaultException): Le message avec 'net.msmq: // localhost/private/adpqueue' ne peut pas être traité sur le récepteur, en raison d'une discordance AddressFilter sur EndpointDispatcher. Vérifiez que les EndpointAddresses de l'expéditeur et du destinataire sont d'accord. Dans cette erreur, Code.Name = Sender et Code.SubCode.Name = DestinationUnreachable

après les tentatives, il devient une MsmqPoisonMessageException, il obtient un LookupId. Avec ce lookupid je fais le ReceiveByLookupId (lookupId) (avec la classe standard System.Messaging.MessageQueue). Cela entraîne une exception InvalidOperationException. Après cela, le service redémarrera et le cycle redémarrera, cela ne se termine jamais. (après le redémarrage, la purge de la file d'attente ne s'arrête jamais).

Si vous ouvrez Gestion de l'ordinateur et regardez s'il y a un message sur la file d'attente il est vide. Mais lorsque j'ouvre le fichier p0000001.mq (dans le dossier C: \ WINDOWS \ system32 \ msmq \ storage) avec un éditeur de texte, vous pouvez voir le message. Si vous supprimez ce fichier, tout fonctionne à nouveau. Je ne peux pas recréer le problème en utilisant l'application (je peux recréer le problème parce que j'ai sauvé un fichier .mq corrompu), il arrive juste parfois.

Cette situation n'est pas réalisable. - N'importe quelle idée est de savoir comment je peux résoudre ce problème par le code ou comment l'empêcher de se produire? - Pourquoi le service wcf peut-il voir le message, mais MessageQueue avec LookupId ne voit rien? - Existe-t-il un autre moyen d'interroger la file d'attente avec un LookupId? - Comment cette situation peut-elle se produire? Je peux voir tous les autres messages.

Répondre

2

J'ai finalement trouvé mon problème. Du côté réception de la file d'attente, j'utilisais une portée de transaction imbriquée. Lorsque ce happend: - Message non valide reçu - Exception - attraper l'exception - Eliminer la transaction imbriquée

Mais l'exception a été lancée un peu plus tôt, la transaction imbriquée n'a pas été encore fibres libérées.

Je pense que cette infection la transaction de la transaction MSMQ et le message est passé verrouillé et illisible par le poisonhandle. Lorsque le service a été redémarré, il peut être relu, mais il est de nouveau illisible en raison de la suppression de la transaction imbriquée.

( de rejouer ce comportement dans votre opération de réception de type ceci: nouveau TransactionScope (TransactionScopeOption.Required) .Dispose(); )