2011-07-28 4 views
0

저는 nServiceBus를 처음 사용합니다.nServiceBus 및 IsTransactional (거짓)

버스가 IsTransactional (true)로 구성되고 처리기가 많은 db 상호 작용을하는 경우 asp.net mvc 응용 프로그램이 중단됩니다. "- 우리가 거래에서 웹 응용 프로그램을 끊고 싶은, 그래서이 전원을 끄지 마십시오 IsTransactional (거짓)"

을 그리고 그것은 도움이 - 페이지는 다음과 같습니다

- - http://adamfyles.blogspot.com/2010/08/getting-started-with-nservicebus-part-2_25.html 나는 팁을 발견 빨리 상쾌하게. 반면에 예외가 발생하면 msmq 대기열이 손실됩니다. 내가 말했듯이

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

    row.ReportId = reportId; 
} 

db.Save(); 

, 나는 nServiceBus에 새로운 해요 : 그것은 어떤 DB 행을 반복 처리하는 보고서를 생성하고 그 기록에 'ReportId'키를 업데이트 -

날 핸들러가 무엇을 설명하게 . 이것을 위해 사가를 사용해야합니까? 아직 사가가 뭔지 몰라. 아니면 다음과 같이 할 수 있습니다.

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

핸들러에서 보고서를 생성하고 행을 업데이트하도록 하시겠습니까? 모든 기록이 갱신되었음을 어떻게 알 수 있습니까? 이 경우 웹 앱도 'IsTransactional (true)'로 전화를 끊습니까?

  1. 은 내가 내가 '(false)를 IsTransactional'를 사용하고 경우에주의해야합니다

    내 질문 (I 네 의심)?

  2. 많은 레코드를 업데이트하는 가장 좋은 방법은 무엇입니까? 루프에서 업데이트 하시겠습니까? 웹 앱이 멈추지 않게하고 싶습니다.

편집, BTW이 코드는 웹 응용 프로그램을 끊지 것, 그것은 (사실) 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)로 메시지가 손실 될 수도 있습니다. 트레이드 오프는 트랜잭션 경계에 웹 애플리케이션을 포함시키지 않는다는 것입니다. 그것을 포함 시키면 웹 애플리케이션이 서버 측에서 뒤로 기다릴 때 속도가 느려질 수 있습니다. 다른 엔드 포인트로 메시지 전달을 제안하여 트랜잭션 작업을 수행하거나 내장 WCF 통합을 사용하여 트랜잭션 엔드 포인트를 노출하십시오. WCF 경로로 이동하면 오류 코드 이외의 서비스에서 반환 할 수없는 것을 기억하십시오. 그것은 또한 상자에서 basicHttpBinding을 사용하지만 원하는 경우 변경할 수 있습니다.