2010-06-11 2 views
3

Всюду, где я читаю, говорится, что сообщения, обрабатываемые сервис-брокером, обрабатываются в том порядке, в котором они поступают, но при создании таблицы, типа сообщения, контракта, услуги и т. Д. И при активации сохраняются proc, который ждет 2 секунды и вставляет msg в таблицу, устанавливают максимальные считыватели очередей на 5 или 10 и отправляют 20 нечетных сообщений, которые я вижу в таблице, которые они вставлены вне порядка, даже если я вставляю их в очереди и посмотреть содержимое очереди, я вижу, что все сообщения находятся в правильном порядке.сервисный брокер процесс обработки сообщений

Это связано с задержкой ожидания в ожидании ближайшей секунды и каждой нити, имеющей разные субсекундные времена, а затем сражающейся за блокировку или что-то в этом роде?

Причина у меня есть задержка там для имитации задержек с соединениями и т.д.

Благодаря

демо-код:

--create the table and service broker 

CREATE TABLE test 
(
id int identity(1,1), 
contents varchar(100) 
) 

CREATE MESSAGE TYPE test 

CREATE CONTRACT mycontract 
(
test sent by initiator 
) 
GO 
CREATE PROCEDURE dostuff 
AS 
BEGIN 
    DECLARE @msg varchar(100); 
    RECEIVE TOP (1) @msg = message_body FROM myQueue 
    IF @msg IS NOT NULL 
    BEGIN 
     WAITFOR DELAY '00:00:02' 
     INSERT INTO test(contents)values(@msg) 
    END 
END 
GO 
ALTER QUEUE myQueue 
    WITH STATUS = ON, 
    ACTIVATION (
     STATUS = ON, 
     PROCEDURE_NAME = dostuff, 
     MAX_QUEUE_READERS = 10, 
     EXECUTE AS SELF 
    ) 

create service senderService 
on queue myQueue 
(
mycontract 
) 

create service receiverService 
on queue myQueue 
(
mycontract 
) 
GO 

--********************************************************** 

--now insert lots of messages to the queue 

DECLARE @dialog_handle uniqueidentifier 

    BEGIN DIALOG @dialog_handle 
     FROM SERVICE senderService 
     TO SERVICE 'receiverService' 
     ON CONTRACT mycontract; 

    SEND 
     ON CONVERSATION @dialog_handle 
     MESSAGE TYPE test 
     ('<test>1</test>'); 

    BEGIN DIALOG @dialog_handle 
     FROM SERVICE senderService 
     TO SERVICE 'receiverService' 
     ON CONTRACT mycontract; 

    SEND 
     ON CONVERSATION @dialog_handle 
     MESSAGE TYPE test 
     ('<test>2</test>') 

    BEGIN DIALOG @dialog_handle 
     FROM SERVICE senderService 
     TO SERVICE 'receiverService' 
     ON CONTRACT mycontract; 

    SEND 
     ON CONVERSATION @dialog_handle 
     MESSAGE TYPE test 
     ('<test>3</test>') 

BEGIN DIALOG @dialog_handle 
     FROM SERVICE senderService 
     TO SERVICE 'receiverService' 
     ON CONTRACT mycontract; 

    SEND 
     ON CONVERSATION @dialog_handle 
     MESSAGE TYPE test 
     ('<test>4</test>') 

BEGIN DIALOG @dialog_handle 
     FROM SERVICE senderService 
     TO SERVICE 'receiverService' 
     ON CONTRACT mycontract; 

    SEND 
     ON CONVERSATION @dialog_handle 
     MESSAGE TYPE test 
     ('<test>5</test>') 

BEGIN DIALOG @dialog_handle 
     FROM SERVICE senderService 
     TO SERVICE 'receiverService' 
     ON CONTRACT mycontract; 

    SEND 
     ON CONVERSATION @dialog_handle 
     MESSAGE TYPE test 
     ('<test>6</test>') 

BEGIN DIALOG @dialog_handle 
     FROM SERVICE senderService 
     TO SERVICE 'receiverService' 
     ON CONTRACT mycontract; 

    SEND 
     ON CONVERSATION @dialog_handle 
     MESSAGE TYPE test 
     ('<test>7</test>') 

ответ

3

Чтобы оставаться в том же порядке, сообщения должны отправляться в тот же разговор. Если вы создаете беседу на сообщение (как показывает большинство примеров), то заказ, который они поставлены, не гарантируется.

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

+0

ahhhh большое спасибо. В этом есть смысл. – Blootac

+0

Я изменил код выше, так что начальный диалоговый блок запускается только один раз, и все сообщения отправляются с использованием одного и того же дескриптора, но я все еще не получаю сообщения о порядке. Есть идеи? – Blootac

+0

Мне нужно было использовать «WITH RELATED_CONVERSATION =» для связи новых сообщений со старой группой разговоров – Blootac