Всюду, где я читаю, говорится, что сообщения, обрабатываемые сервис-брокером, обрабатываются в том порядке, в котором они поступают, но при создании таблицы, типа сообщения, контракта, услуги и т. Д. И при активации сохраняются 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>')
ahhhh большое спасибо. В этом есть смысл. – Blootac
Я изменил код выше, так что начальный диалоговый блок запускается только один раз, и все сообщения отправляются с использованием одного и того же дескриптора, но я все еще не получаю сообщения о порядке. Есть идеи? – Blootac
Мне нужно было использовать «WITH RELATED_CONVERSATION =» для связи новых сообщений со старой группой разговоров – Blootac