Главная » Microsoft SQL Server, Базы данных » Работа с диалогами

0

После того как объект брокера служб создан, сообщения могут помещаться в очередь и извлекаться из нее. Сообщения существуют как часть общения, которое может быть разбито на группы взаимодействия.

Отправка сообщения в очередь

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

BEGIN TRANSACTION ;

DECLARE @message XML ;

SET @message = N'<message>Hello, World!</message>1 ;

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'<none/>1 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://schemas.microsoft.com/SQL/ServiceBroker/EndDialog’ OR @message_type_name =

‘http://schemas.microsoft.com/SQL/ServiceBroker/Error’ BEGIN

END CONVERSATION @conversation__handle ;

END ;

END; — Обработка всех сообщений в группе взаимодействия.

– Подтверждение инструкций получения и завершение общения. COMMIT TRANSACTION ;

END ; — Обработка всех групп взаимодействия, use tempdb;;

Источник: Нильсен, Пол. Microsoft SQL Server 2005. Библия пользователя. : Пер. с англ. — М. : ООО “И.Д. Вильямс”, 2008. — 1232 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии