2010-06-11 5 views
3

서비스 브로커가 처리 한 메시지는 도착한 순서대로 처리되지만 테이블, 메시지 유형, 계약서, 서비스 등을 생성하면 활성화시 저장된 proc는 2 초를 기다리고 msg를 테이블에 삽입하고, 최대 큐 리더를 5 또는 10으로 설정하고, 테이블에 20 개의 이상한 메시지를 보냅니다. 테이블에 삽입 할 때 순서대로 삽입됩니다. 대기열의 내용을 살펴보고 메시지가 모두 올바른 순서로 표시되는지 확인할 수 있습니다.서비스 브로커 메시지 프로세스 순서

가장 가까운 초를 기다리는 지연 waitfor와 각기 다른 하위 시간이 다른 각 스레드가 있고 잠금 또는 무언가를 위해 싸우는 것이 그 원인입니까?

감사

을 조인과 지연을 시뮬레이션 할 수 있습니다에 내가 지연이있어 이유 데모 코드는

:

--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

아 감사합니다. 그건 의미가 있습니다. – Blootac

+0

위의 코드를 변경하여 시작 대화 상자 블록이 한 번만 실행되고 모든 메시지가 동일한 핸들을 사용하여 보내지 만 여전히 주문 메시지가 표시됩니다. 어떤 생각? – Blootac

+0

새 메시지를 이전 대화 그룹에 연결하려면 'WITH RELATED_CONVERSATION ='을 사용해야합니다. – Blootac

관련 문제