2010-06-11 32 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