2011-07-28 10 views
0

私はnServiceBusを使い慣れています。nServiceBusとIsTransactional(false)

バスがIsTransactional(true)で構成されていて、ハンドラが多くのデータベースと対話している場合、 asp.net mvcアプリケーションがハングアップします。ここで

からhttp://adamfyles.blogspot.com/2010/08/getting-started-with-nservicebus-part-2_25.html - 私はヒントが見つかりました:「 - 私たちは、取引でウェブアプリをハングアップしたいので、これをオフにしないでくださいIsTransactional(偽)」

をそして、それは助けた - ページがありますすばやくリフレッシュ。反対に、例外が発生すると、msmqキューは失われます。

私は、ハンドラが何をするのか説明しましょう - それは、いくつかのDBの行を反復処理レポートを生成し、そのレコードの「ReportId」キーを更新します。

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

    row.ReportId = reportId; 
} 

db.Save(); 

私が言ったように、私はnServiceBusに新たなんです。私はこのために佐賀を使用しなければなりませんか?まだ私はサガのことを理解していません。あるいは、私は次のようなことをすることができます:

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

そして、ハンドラにレポートを生成させてその行を更新させますか?すべてのレコードが更新されたことをどのように知ることができますか?この場合、Webアプリケーションも 'IsTransactional(true)'でハングアップしますか?

  1. は私が私が「(偽)IsTransactional」を使用しているときに注意する必要があります。

    私の質問を(私はイエスと思われますか)?

  2. 多くのレコードを更新するにはどうすればよいですか?ループでそれらを更新するだけですか?そして、私は、Webアプリがハングアップしないようにしたい。

EDIT

はところで、このコードは、Webアプリケーションを掛けないように思われ、それがIsTransactional(真)で動作します。

これは良いアプローチですか?

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

トピックはありませんが、Udi DahanはNServiceBusについてdnrTVに関する講演を行いました - http://www.dnrtv.com/default.aspx?showNum=199 – Phill

答えて

0

IsTransactional(false)でメッセージが失われる可能性があります。トレードオフは、トランザクション境界にWebアプリケーションを含めないことです。これを含めると、サーバー側からの返信を待っているため、Webアプリケーションが遅くなる可能性があります。別のエンドポイントにメッセージを転送して、トランザクショナルな作業を実行するか、組み込みのWCF統合を使用してトランザクションエンドポイントを公開することをお勧めします。 WCFルートに行く場合は、エラーコード以外のサービスから何も返すことができないことを覚えておいてください。それはまたボックスのbasicHttpBindingを使いますが、あなたが望むならそれを変更することができます。