2010-06-11 36 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 2010-06-11 17:36:21

+0

我改變了上面的代碼,以便開始對話框塊只運行一次,所有的消息都使用相同的句柄發送,但是我仍然得到亂序消息。任何想法? – Blootac 2010-06-14 08:27:48

+0

我需要使用'WITH RELATED_CONVERSATION ='將新消息鏈接到舊的對話組 – Blootac 2010-07-09 11:55:30