私は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)'でハングアップしますか?
は私が私が「(偽)IsTransactional」を使用しているときに注意する必要があります。
私の質問を(私はイエスと思われますか)?
多くのレコードを更新するにはどうすればよいですか?ループでそれらを更新するだけですか?そして、私は、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();
}
トピックはありませんが、Udi DahanはNServiceBusについてdnrTVに関する講演を行いました - http://www.dnrtv.com/default.aspx?showNum=199 – Phill