2009-09-16 9 views
0

c'est une chose étrange. J'ai créé un simple service Web basé sur SOAP avec WCF. Lorsque la méthode 'SubmitTransaction' est appelée, la transaction est transmise à un service d'application. Mais si le service d'application n'est pas disponible, il est écrit dans un MSMQ.Lent MSMQ dans un service WCF

Comme ceci:

public void SubmitTransaction(someTransaction) 
{ 
    try 
    { 
    // pass transaction data to application 
    } 
    catch(SomeError) 
    { 
    // write to MSMQ 
    } 
} 

Alors, quand une erreur de la transaction est occures écrit dans la file. Maintenant, lorsque vous utilisez l'API MSMQ directement dans mon service WCF, tout va bien. Chaque appel prend quelques millisecondes.

par exemple .:

... 
catch(SomeError) 
{ 
    // write to MSMQ 
    var messageQueue = new MessageQueue(queuePath); 
    try 
    { 
    messageQueue.Send(accountingTransaction, MessageQueueTransactionType.Single); 
    } 
    finally 
    { 
    messageQueue.Close(); 
    } 
} 

Mais depuis que je veux utiliser la fonctionnalité de file d'attente de messages à d'autres points du système ainsi, j'ai créé un nouvel ensemble qui prend en charge l'écriture de file d'attente de messages.

Comme:

... 
catch(SomeError) 
{ 
    // write to MSMQ 
    var messageQueueService = new MessageQueueService(); 
    messageQueueService.WriteToQueue(accountingTransaction); 
} 

Maintenant lorsque vous utilisez cette configuration, le service Web est soudainement très lent. À partir des millisecondes mentionnées ci-dessus, chaque appel prend maintenant jusqu'à 4 secondes. Seulement parce que le contenu de la file d'attente de messages est encapsulé dans un nouvel assemblage. La logique est exactement la même. Quelqu'un sait ce que le problème pourrait être ...?

Merci!

Répondre

1

Ok, maintenant je sais. Cela a quelque chose à voir avec ma configuration de journalisation (log4net). Je vais devoir vérifier ça en premier. Désolé de voler votre temps ..

0

Vous avez deux nouvelles lignes de code ici:

var messageQueueService = new MessageQueueService(); 
messageQueueService.WriteToQueue(accountingTransaction); 

Savez-vous lequel des deux est à l'origine du problème? Peut-être ajouter un logging, ou un profilage, ou passer par un débogueur pour voir lequel semble lent.

+0

Je vais essayer de mesurer le temps. Mais ces deux lignes sont juste un remplacement pour les choses que j'ai montrées ci-dessus. var messageQueueService = new MessageQueueService() ne fait rien mais crée une nouvelle instance. messageQueueService.WriteToQueue (accountingTransaction) fait exactement la même chose que dans le premier exemple. Si je copie directement le contenu de cette méthode dans le service, tout est à nouveau rapide. La seule différence est que c'est dans une autre assemblée ... – Chris