Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Непонятный перезапуск процедуры активации в Service Broker  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 199
Добрый день. Столкнулся не понятным мне поведением SB.
+ Пример

create database TestBroker
go
alter database TestBroker set enable_broker
go
use TestBroker
go

create message type [AsyncRequest] validation = none;
create message type [AsyncResult]  validation = none;

create contract [AsyncContract] 
(
  [AsyncRequest] sent by initiator,
  [AsyncResult]  sent by target
);


create queue ProcessingQueue;                                                   
create service [ProcessingService] on queue ProcessingQueue ([AsyncContract]);  

create queue RequestQueue;
create service [RequestService] on queue RequestQueue;
go

create procedure dbo.SendBrokerMessage 
	@FromService sysname,
	@ToService   sysname,
	@Contract    sysname,
	@MessageType sysname,
	@MessageBody xml
as
begin
  set nocount on;
 
  declare @conversation_handle uniqueidentifier;
 
  begin transaction;
 
  begin dialog conversation @conversation_handle
    from service @FromService
    to service @ToService
    on contract @Contract
    with encryption = off;
 
  send on conversation @conversation_handle
    message TYPE @MessageType(@MessageBody);
 
  commit transaction;
end
go


create procedure dbo.ProcessingQueueActivation
as
begin
    ;receive top (1) *
      from ProcessingQueue
    
    waitfor delay '00:01:00';
 
end
go

alter queue ProcessingQueue with activation
( status = on, procedure_name = dbo.ProcessingQueueActivation,
  max_queue_readers = 1, execute as self );
go
 
execute dbo.SendBrokerMessage
  @FromService = N'RequestService',
  @ToService   = N'ProcessingService',
  @Contract    = N'AsyncContract',
  @MessageType = N'AsyncRequest',
  @MessageBody = N'<A></A>';

  select *
      from ProcessingQueue


Согласно этой упрощенной логике waitfor проходит и процедура заканчивает выполнение.
Но если в процессе выполнения делаю kill сессии, в которой выполняется процедура, - она перезапускается.
Я думал, что т.к. новых сообщений в очереди нет ( receive уже забирал единственное сообщение ), процедура не перезапустится.
Сходу в документации не нашел объяснения.
Может кто-то знает?

+ @@version
Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (X64)
Aug 19 2014 12:21:34
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
18 окт 17, 17:32    [20879891]     Ответить | Цитировать Сообщить модератору
 Re: Непонятный перезапуск процедуры активации в Service Broker  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
Pavel1211,

Service Broker полностью поддерживает транзакционную модель.
Поэтому когда вы делаете kill вы откатываете транзакцию, сообщение возвращается в очередь.

По умолчанию механизм poison_message_handling срабатывает после 5 неудачных транзакций.

поэтому не удивляйтесь что активация срабатывает вновь после возврата сообщения в очередь
18 окт 17, 19:00    [20880123]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить