Асинхронный вызов хранимого Proc с использованием сервиса Broker - PullRequest
1 голос
/ 24 ноября 2011

В моем приложении мне нужно асинхронно вызывать хранимый процесс. Для этого я использую Sql Service Broker. Это этапы, используемые при создании асинхронного вызова.

1) Я создал Сообщение, Контракт, Очередь, Сервис. И отправка сообщений. Я вижу свои сообщения в «ReceiveQueue1».

2) Я создал сохраненный Proc и очередь Когда я выполняю Stored Proc (proc_AddRecord), он выполняется только один раз. Это чтение всех записей в очередях и добавление этих записей в таблицу. До этого момента он работал нормально. Но когда я добавляю несколько новых сообщений в ReceiveQueue1, мой сохраненный процесс не добавляет эти автоматически записывает в таблицу. Я должен повторно выполнить сохраненный процесс (proc_AddRecord) Чтобы добавить новые сообщения. Почему сохраненный процесс не выполняется. Что я должен сделать для того, чтобы асинхронно вызывать хранимый процесс. Весь смысл использования Service Broker заключается в асинхронном вызове хранимых процедур. Я совершенно новичок в SQL Server Service Broker. Ценю любую помощь. Вот мой код для хранимого Proc

#
--exec proc_AddRecord

ALTER PROCEDURE proc_AddRecord
AS

Declare
    @Conversation UniqueIdentifier,
    @msgTypeName nvarchar(200),
    @msg varbinary(max)

While (1=1)
Begin
    Begin Transaction;

    WAITFOR
    (
        Receive Top (1) 
            @Conversation = conversation_handle,
            @msgTypeName =  message_type_name,
            @msg = message_body
        from dbo.ReceiveQueue1
    ), TIMEOUT 5000


    IF @@Rowcount = 0
        Begin 
            Rollback Transaction
            Break
        End
    PRINT  @msg
    If @msg = 'Sales'
        BEGIN
            insert into TableCity(deptNo,Manager,Group,EmpCount) VALUES(101,'Reeves',51, 29)
            COMMIT Transaction
            Continue
        End
    If @msg = 'HR'
        BEGIN
            insert into  TableCity(deptNo,Manager,Group,EmpCount) VALUES(102,'Cussac',55, 14)
            COMMIT Transaction
            Continue
        End

    Begin
        Print 'Process end of dialog messages here.'
        End Conversation @Conversation
        Commit Transaction
        Continue
    End
    Rollback Transaction
END

ALTER QUEUE AddRecorQueue
WITH ACTIVATION (
                PROCEDURE_NAME=proc_AddRecord,
                MAX_QUEUE_READERS = 1,
                STATUS = ON,
                EXECUTE AS 'dbo');

1 Ответ

3 голосов
/ 26 ноября 2011

Вы говорите, что выполняете хранимую процедуру, вам не нужно делать это, даже не один раз, это всегда должно быть сделано с активацией.

Если ваша активация будет вместо вашего 'ReceiveQueue1' вместо этогоиз вашего «AddRecorQueue» я не вижу остальной части вашего кода, но названия подсказывают это.

Где начинается и заканчивается ваша хранимая процедура?Как правило, я бы поместил BEGIN сразу после оператора AS и END там, где должна заканчиваться хранимая процедура. Если у вас их нет, вам понадобится оператор GO, чтобы отделить его.В противном случае ваш оператор ALTER QUEUE будет частью хранимой процедуры

У вас также есть «транзакция отката», поэтому, даже если активация работала, все это откатилось бы, или возникла бы ошибка, в которой не было транзакциииз операторов IF сработало.

Я предлагаю вам следовать этому учебному пособию для сервисного брокера в целом и этому вопросу о внутренней активации .Они должны начать вас.

...