piektdiena, 2011. gada 4. novembris

Service Broker: dialoga piespiedu pārtraukšana

Līdz ar ziņojuma nosūtīšanu no viena servisa otram, tiek uzsākts dialogs starp šiem servisiem. Dialoga pārtraukšanai abos servisos ir jāizpilda komanda "End Conversation". Normālā gadījumā servisu saustarpējā saziņa šādi arī vienmēr ir jāpārtrauc. Tomēr ir gadījumi, kad šāda iespēja nepastāv.

Principā gadījumi, kad dialogi netiek pārtraukti pareizi ir tikai divi:
  • Testējot (izstrādes laikā).
  • Manuāli apstrādājot kādu rindas elementu (kas būtu jādara avārijas gadījumā)
Šādos gadījumos var izmantot komandu (no parastā gadījumā atšķiras ar "With Cleanup"):
End Conversation @conversation_handle With Cleanup
conversation_handle var iegūt no skata sys.conversation_endpoints (vairāk rakstā Service Broker: rindu monitorings).

Redzot produkcijas kodā "With Cleanup" ir nopietns pamats domāt, ka SB servisi nav korekti izveidoti.

Bet testēšanas nolūkos tomēr tas ir ļoti noderīgi. Un visu dialogu piespiedu beigšanai datu bāzē var izmantot šo vaicājumu:
declare @x uniqueidentifier
declare cur cursor for
        Select conversation_handle From sys.conversation_endpoints

open cur
fetch next from cur into @x
while @@fetch_status = 0
begin
    End Conversation @x With Cleanup
    fetch next from cur into @x
end

close cur;
Deallocate cur;

Nav komentāru:

Komentāra publicēšana