2011-07-28 3 views
0

Je suis nouveau sur nServiceBus.nServiceBus et IsTransactional (faux)

Si le bus est configuré avec IsTransactional (true) et que le gestionnaire a beaucoup d'interaction db, l'application asp.net mvc raccroche.

ici - http://adamfyles.blogspot.com/2010/08/getting-started-with-nservicebus-part-2_25.html - J'ai trouvé une astuce: "IsTransactional (false) - nous ne voulons pas bloquer une application web dans les transactions, donc désactiver cette"

et il a aidé - la page est rafraîchissant rapidement. D'un autre côté, si une exception se produit, la file d'attente msmq est perdue.

Laissez-moi vous expliquer ce que le gestionnaire fait - il itère sur certaines lignes de db, génère un rapport et met à jour la clé « reportId » sur ce disque:

foreach(var row in rows) 
{ 
    var reportId = GenerateReport(row); 

    row.ReportId = reportId; 
} 

db.Save(); 

Comme je l'ai dit, je suis nouveau nServiceBus . Dois-je utiliser Saga pour ça? Je ne comprends pas encore les saga. Ou peut-être que je peux faire quelque chose comme ceci:

foreach(var row in rows) 
{ 
    _bus.Send(new GenerateReportMessage{Id = row.Id}); 
}  

Et laisser le gestionnaire générer le rapport et mettre à jour la ligne? Comment saurai-je que tous les enregistrements ont été mis à jour? L'application web va-t-elle aussi se bloquer avec 'IsTransactional (true)' dans ce cas? (Je pense que oui)

Mes questions:

  1. Que dois-je être au courant lorsque j'utilise 'IsTransactional (false)?

  2. Quelle est la meilleure façon de mettre à jour un grand nombre d'enregistrements? Juste les mettre à jour dans la boucle? Et je ne veux pas que l'application web se bloque.

EDIT

BTW, ce code semble ne pas bloquer l'application Web, et il travaille avec IsTransactional (true).

Est-ce une bonne approche?

using (new TransactionScope(TransactionScopeOption.Suppress)) 
{ 

    foreach(var row in rows.Where(x => x.ReportId != null)) 
    { 
    var reportId = GenerateReport(row); 

    row.ReportId = reportId; 
    } 

    db.Save();  
} 
+0

Hors sujet mais Udi Dahan a fait une présentation sur dnrTV à propos de NServiceBus - http://www.dnrtv.com/default.aspx?showNum=199 – Phill

Répondre

0

Vous avez raison de perdre des messages avec IsTransactional (false). Le compromis est que vous n'incluez pas l'application Web dans la limite transactionnelle. L'inclure peut ralentir votre application web car elle attend des retours du serveur. Je suggère de transmettre le message à un autre point de terminaison pour effectuer le travail transactionnel ou exposer un point de terminaison transactionnel à l'aide de l'intégration WCF intégrée. Si vous allez sur la route WCF, rappelez-vous que vous ne pouvez rien retourner du service autre qu'un code d'erreur. Il utilise également le basicHttpBinding hors de la boîte, mais vous pouvez le changer si vous le désirez.