서비스 브로커가 처리 한 메시지는 도착한 순서대로 처리되지만 테이블, 메시지 유형, 계약서, 서비스 등을 생성하면 활성화시 저장된 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>')
아 감사합니다. 그건 의미가 있습니다. – Blootac
위의 코드를 변경하여 시작 대화 상자 블록이 한 번만 실행되고 모든 메시지가 동일한 핸들을 사용하여 보내지 만 여전히 주문 메시지가 표시됩니다. 어떤 생각? – Blootac
새 메시지를 이전 대화 그룹에 연결하려면 'WITH RELATED_CONVERSATION ='을 사용해야합니다. – Blootac