This example uses AdventureWorks and AdventureWorksTarget (an empty AdventureWorks db).
1 Initial Setup of databases -
-- Allow databases access to external object USE Master ALTER DATABASE AdventureWorks SET TRUSTWORTHY ON ALTER DATABASE AdventureWorksTarget SET TRUSTWORTHY ON -- Enable Databases for Service Broker ALTER DATABASE AdventureWorks SET NEW_BROKER ALTER DATABASE AdventureWorksTarget SET NEW_BROKER -- Needed these as had downloaded Adventureworks and user that created it was not present. -- Good practice anyway... ALTER AUTHORIZATION ON DATABASE::AdventureWorks TO sa; ALTER AUTHORIZATION ON DATABASE::AdventureWorksTarget TO sa;
2 Configuration of Target DB (do before source!) -
USE AdventureWorksTarget
GO
-- Set Key for Service Broker Communication
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'PASSWORD2008'
-- Configure Message Types on target
CREATE MESSAGE TYPE [http://www.servicebroker.com/SendType]
VALIDATION = WELL_FORMED_XML;
CREATE MESSAGE TYPE [http://www.servicebroker.com/ResponseType]
VALIDATION = WELL_FORMED_XML;
GO
-- Configure Contract
-- Contract defines a message broker conversation
CREATE CONTRACT [http://www.servicebroker.com/Contract]
([http://www.servicebroker.com/SendType]
SENT BY INITIATOR,
[http://www.servicebroker.com/ResponseType]
SENT BY TARGET
);
GO
-- Configure Queue
CREATE QUEUE [AdventureWorksTargetQueue];
-- Turn Queue on
ALTER QUEUE [AdventureWorksTargetQueue]
WITH STATUS = ON
-- Configure Service
CREATE SERVICE [AdventureWorksTargetQueueTargetService]
ON QUEUE [AdventureWorksTargetQueue]
([http://www.servicebroker.com/Contract]);
GO
3 Configuration of the Source DB -
USE AdventureWorks
GO
-- Set Key for Service Broker Communication
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'PASSWORD2008'
-- Configure Message Types on source
CREATE MESSAGE TYPE [http://www.servicebroker.com/SendType]
VALIDATION = WELL_FORMED_XML;
CREATE MESSAGE TYPE [http://www.servicebroker.com/ResponseType]
VALIDATION = WELL_FORMED_XML;
GO
-- Configure Contract
-- Contract defines a message broker conversation
CREATE CONTRACT [http://www.servicebroker.com/Contract]
([http://www.servicebroker.com/SendType]
SENT BY INITIATOR,
[http://www.servicebroker.com/ResponseType]
SENT BY TARGET
);
GO
-- Configure Queue
CREATE QUEUE [AdventureWorksSourceQueue];
-- Turn Queue on
ALTER QUEUE [AdventureWorksSourceQueue]
WITH STATUS = ON
-- Configure Service
CREATE SERVICE [AdventureWorksSourceQueueSourceService]
ON QUEUE [AdventureWorksSourceQueue];
GO
4 Examining the contents of the message queues.
Run this, no records will be returned just yet though -
-- Monitoring Queue contents select * from AdventureWorks..[AdventureWorksSourceQueue] select * from AdventureWorksTarget..[AdventureWorksTargetQueue] -- Where is my message? (Look at transmission_status for error information) select transmission_status,* from AdventureWorks.sys.transmission_queue select transmission_status,* from AdventureWorksTarget.sys.transmission_queue
5 Sending a Message -
-- Send the Message
DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
DECLARE @RequestMsg NVARCHAR(100);
BEGIN TRANSACTION;
BEGIN DIALOG @InitDlgHandle
FROM SERVICE [AdventureWorksSourceQueueSourceService]
TO SERVICE N'AdventureWorksTargetQueueTargetService'
ON CONTRACT [http://www.servicebroker.com/Contract]
WITH ENCRYPTION = OFF;
SELECT @RequestMsg =
N'Initial Service Broker Message from AdventureWorks ';
SEND ON CONVERSATION @InitDlgHandle
MESSAGE TYPE [http://www.servicebroker.com/SendType]
(@RequestMsg);
SELECT @RequestMsg AS SentRequestMsg;
COMMIT TRANSACTION;
GO
-- Examine the queues to see the message just transmitted in the target one >
select * from AdventureWorks..[AdventureWorksSourceQueue]
select * from AdventureWorksTarget..[AdventureWorksTargetQueue]
6 Read & Respond to the message -
-- Read the message on the target server and respond to it
USE AdventureWorksTarget
DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;
DECLARE @RecvReqMsg NVARCHAR(100);
DECLARE @RecvReqMsgName sysname;
BEGIN TRANSACTION;
WAITFOR
( RECEIVE TOP(1)
@RecvReqDlgHandle = conversation_handle,
@RecvReqMsg = message_body,
@RecvReqMsgName = message_type_name
FROM [AdventureWorksTargetQueue]
), TIMEOUT 1000;
SELECT @RecvReqMsg AS ReceivedRequestMsg;
IF @RecvReqMsgName =
N'http://www.servicebroker.com/SendType'
BEGIN
DECLARE @ReplyMsg NVARCHAR(100);
SELECT @ReplyMsg =
N'Reply Service Broker Message from AdventureWorksTarget ';
SEND ON CONVERSATION @RecvReqDlgHandle
MESSAGE TYPE
[http://www.servicebroker.com/ResponseType] (@ReplyMsg);
END CONVERSATION @RecvReqDlgHandle;
END
SELECT @ReplyMsg AS SentReplyMsg;
COMMIT TRANSACTION;
GO
-- Examine the queues to see the response message back on the source queue,
-- along with an EndDialog message for it. >
-- It is no longer in the target queue.
select * from AdventureWorks..[AdventureWorksSourceQueue]
select * from AdventureWorksTarget..[AdventureWorksTargetQueue]
7 Send message response & close the conversation -
-- read the response on the sender & close conversation. use AdventureWorks go DECLARE @RecvReplyMsg NVARCHAR(100); DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER; BEGIN TRANSACTION; WAITFOR ( RECEIVE TOP(1) @RecvReplyDlgHandle = conversation_handle, @RecvReplyMsg = message_body FROM [AdventureWorksSourceQueue] ), TIMEOUT 1000; END CONVERSATION @RecvReplyDlgHandle; -- Display recieved request. SELECT @RecvReplyMsg AS ReceivedReplyMsg; COMMIT TRANSACTION; GO -- Examine the queues once more. -- Having verified receipt of the message. the Source queue is empty again. select * from AdventureWorks..[AdventureWorksSourceQueue] select * from AdventureWorksTarget..[AdventureWorksTargetQueue]
No comments:
Post a Comment