6
votes

Puis-je jeter un coup d'œil à MSMQ vide sans obtenir une exception?

Autant que je puisse voir de la documentation, la façon dont vous êtes censé vérifier s'il y a des messages dans une file d'attente de message consiste à utiliser la méthode PEEK. Vous comptez ensuite sur elle à l'échec avec une idée de message à vous dire que la file d'attente était vide. XXX

J'ai toujours été informé - et avez-vous expérimenté - que les exceptions sont coûteuses et ne doivent pas être utilisées. pour des opérations normales. Donc, mes questions sont:

  • sont mes hypothèses qui s'appuient sur l'attrape de la messagerieXeEeException sont une opération coûteuse correcte?

  • Y a-t-il un moyen de vérifier de manière synchrone s'il y a des messages dans une file d'attente sans avoir à compter sur des exceptions?

    Je travaille avec l'espace de noms System.Messervation dans C #, mais si je devrais aller non géré pour résoudre ce problème, cela pourrait être une option. Et notez que je veux une solution sans utiliser wcf avec msmq.


0 commentaires

4 Réponses :


1
votes

Mise à jour: Je ne prétends pas que la performance n'est pas importante. Mais je pense que la communication entre les processus est très coûteuse par rapport à une exception.

avant la mise à jour:

  • Je pense que dans le contexte de la communication intervenue (qui est ce que fait MSMQ), le coût d'exception est sans importance. Testez si vous voulez être sûr.
  • Je ne pense pas.

2 commentaires

Nous passons des messages via un pipeline de services où nous utilisons des files d'attente entre elles. Nous voulons avoir le débit le plus élevé possible, donc ce n'est pas sans importance, mais jusqu'à présent, nous avons une bonne performance.


J'attendrai de voir si je reçois d'autres commentaires, mais si je n'accepterai pas votre réponse: |



-1
votes

MSMQ n'est pas entièrement de communication interprocessée. La communication interprocession est principalement dans une seule machine, mais MSMQ peut être utilisée pour différents ordinateurs communiquant. Livraison Guaranteed, avec Flipside d'avoir dans le même système d'exploitation.


0 commentaires

-2
votes

Que diriez-vous d'essayer mq.getallMessages (). longueur> 0


1 commentaires

Ah bon? Même lorsque votre file d'attente peut contenir 1000 ou 10 000 de gros messages? C'est comme manger tout le supermarché vide juste parce que vous voulez savoir que, ils ont laissé des pommes.



12
votes
  • Oui, vous êtes correct dans l'hypothèse que les exceptions sont coûteuses. En fait, c'est le lancement qui coûte cher, pas le capture. Il est normal que la file d'attente soit vide parfois et qu'un état normal ne devrait pas conduire à une exception étant jetée. P> li>

  • à l'aide de MessageQueue.getMessageenumerator2, nous pourrions utiliser l'énumérateur pour déterminer si une file d'attente est vide ou non sans chargement de tous les messages. Avec cette approche, nous ne chargerions jamais plus d'un message. P> li>

    Exemple: p> xxx pré>

    ou pour implémenter le pommeau qui retourne null si la file d'attente de message est vide (non testée, mais doit fonctionner) P>

    private static Message Peek(MessageQueue queue)
    {
        using (var enumerator = queue.GetMessageEnumerator2())
        {
            return enumerator.MoveNext() ? enumerator.Current : null;
        }
    }
    


0 commentaires