Робота з діалогами

Після того як обєкт брокера служб створений, повідомлення можуть поміщатися в чергу і вилучатись з неї Повідомлення існують як частина спілкування, яке може бути розбите на групи взаємодії

Відправка повідомлення в чергу

У наступному програмному коді створюється обєкт спілкування, що використовує ідентифікатор GUro conversationhandle Команда OPEN CONVERSATION відкриває спілкування, а команда SEND безпосередньо поміщає повідомлення в чергу:

BEGIN TRANSACTION

DECLARE @message XML

SET @message = N&ltmessage&gtHello, World&lt/message&gt1

DECLARE @conversationHandle UNIQUEIDENTIFIER

BEGIN DIALOG CONVERSATION @conversationHandle FROM SERVICE [InitiatorService]

TO SERVICE 1TargetService1 ON CONTRACT [HelloWorldContract]

WITH ENCRYPTION = OFF, LIFETIME = 1000

SEND ON CONVERSATION @conversationHandle MESSAGE TYPE [HelloWorldMessage]

(@message)

END CONVERSATION @conversationHandle

COMMIT TRANSACTION

Для перегляду повідомлень в черзі їх можна витягти з таблиці черзі точно так само, як зі звичайної реляційної таблиці:

SELECT CAST(message_body as nvarchar(MAX)) from [dbo][TargetQueue]

Отримання повідомлень

Команда RECEIVE витягує і видаляє з черги найстаріші повідомлення Укладайте цю команду в транзакцію, щоб, якщо щось піде не так, операцію отримання можна було відкотити і повідомлення залишилося в черзі

Брокер служб не є тригером, який запускається, коли повідомлення поміщається в чергу Для вилучення повідомлення потрібно написати деякий програмний код Компанія Microsoft запропонувала для цих цілей новий параметр команди WAITFOR, що дозволяє очікувати надходження в чергу повідомлення Якщо цього параметра не було, програмі довелося б для перевірки наявності в черги нового повідомлення запускати цикл

Наступний програмний код в збереженій процедурі буде очікувати надходження повідомлень в чергу, а потім отримувати перші з них:

USE Adventureworks

GO

– Обробка всіх груп взаємодії

WHILE (1=1)

BEGIN

DECLARE @conversation_handle UNIQUEIDENTIFIER,

@conversation_group_id UNIQUEIDENTIFIER,

@message_body XML,

@message_type_name NVARCHAR(128)

BEGIN TRANSACTION

– Отримання наступної групи взаємодії

WAITFOR(

GET CONVERSATION GROUP @conversation_group_id FROM  [dbo][TargetQueue]),

TIMEOUT 500

– Якщо груп взаємодії більше немає, відкатуємо – транзакцію і виходимо з зовнішнього циклу WHILE

IF @conversation_group_id IS NULL BEGIN

ROLLBACK TRANSACTION

BREAK

END

– Обробляємо всі повідомлення в групі взаємодії

– Зверніть увагу, що вся обробка зосереджена – в одній транзакції

WHILE 1=1 BEGIN

– Отримання наступного повідомлення в групі взаємодії

– Зверніть увагу, що інструкція отримання – включає пропозицію WHERE для гарантії того,

– Що отримане повідомлення відноситься саме до даної – групі взаємодії RECEIVE ТОР (1)

@conversation_handle = conversation_handle, @message_type_name = message_type_name,

@message_body =

CASE

WHEN validation = X THEN CAST(message_body AS XML)

ELSE CAST(N&ltnone/&gt1 AS XML)

END

FROM [dbo][TargetQueue]

WHERE conversation_group_id = @conversation_group_id

– Якщо більше немає повідомлень або виникла помилка,

– Завершуємо обробку даної групи взаємодії

IF @ @ ROWCOUNT = 0 OR @ @ ERROR про 0 BREAK

– Відображаємо отриману інформацію

SELECT Conversation Group Id = @conversation_group_id, •Conversation Handle1 = @conversation_handle, Message Type Name = @message_type_name,

‘Message Body = @message_body

– Якщо message_type_name вказує на те, що повідомлення – є помилкою або повідомленням кінця діалогу,

– Завершуємо спілкування

IF @message_type_name =

‘http://schemasmicrosoftcom/SQL/ServiceBroker/EndDialog OR @message_type_name =

‘http://schemasmicrosoftcom/SQL/ServiceBroker/Error BEGIN

END CONVERSATION @conversation__handle

END

END – Обробка всіх повідомлень в групі взаємодії

– Підтвердження інструкцій отримання і завершення спілкування COMMIT TRANSACTION

END – Обробка всіх груп взаємодії, use tempdb;

Джерело: Нільсен, Пол Microsoft SQL Server 2005 Біблія користувача : Пер з англ – М: ООО ІД Вільямс , 2008 – 1232 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*