Microsoft SQL Server
Broker di servizi
Ricerca…
1. Nozioni di base
Il broker di servizi è una tecnologia basata sulla comunicazione asincrona tra due (o più) entità. Il broker di servizi è composto da: tipi di messaggi, contratti, code, servizi, percorsi e almeno endpoint di istanza
Altro: https://msdn.microsoft.com/en-us/library/bb522893.aspx
2. Abilitare il broker di servizi sul database
ALTER DATABASE [MyDatabase] SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE;
3. Creare la costruzione del broker di servizi di base sul database (comunicazione su database singolo)
USE [MyDatabase]
CREATE MESSAGE TYPE [//initiator] VALIDATION = WELL_FORMED_XML;
GO
CREATE CONTRACT [//call/contract]
(
[//initiator] SENT BY INITIATOR
)
GO
CREATE QUEUE InitiatorQueue;
GO
CREATE QUEUE TargetQueue;
GO
CREATE SERVICE InitiatorService
ON QUEUE InitiatorQueue
(
[//call/contract]
)
CREATE SERVICE TargetService
ON QUEUE TargetQueue
(
[//call/contract]
)
GRANT SEND ON SERVICE::[InitiatorService] TO PUBLIC
GO
GRANT SEND ON SERVICE::[TargetService] TO PUBLIC
GO
Non abbiamo bisogno di una rotta per una comunicazione di database.
4. Come inviare comunicazioni di base tramite il broker di servizi
Per questa dimostrazione useremo la costruzione del broker di servizi creata in un'altra parte di questa documentazione. La parte menzionata è denominata 3. Creare la costruzione del broker di servizi di base sul database (comunicazione di un singolo database) .
USE [MyDatabase]
DECLARE @ch uniqueidentifier = NEWID()
DECLARE @msg XML
BEGIN DIALOG CONVERSATION @ch
FROM SERVICE [InitiatorService]
TO SERVICE 'TargetService'
ON CONTRACT [//call/contract]
WITH ENCRYPTION = OFF; -- more possible options
SET @msg = (
SELECT 'HelloThere' "elementNum1"
FOR XML PATH(''), ROOT('ExampleRoot'), ELEMENTS XSINIL, TYPE
);
SEND ON CONVERSATION @ch MESSAGE TYPE [//initiator] (@msg);
END CONVERSATION @ch;
Dopo questa conversazione sarà il tuo messaggio in TargetQueue
5. Come ricevere automaticamente la conversazione da TargetQueue
Per questa dimostrazione useremo la costruzione del broker di servizi creata in un'altra parte di questa documentazione. La parte citata è denominata 3. Creazione di base del broker di servizi di base sul database (comunicazione di un singolo database) .
Per prima cosa dobbiamo creare una procedura in grado di leggere ed elaborare i dati dalla coda
USE [MyDatabase]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[p_RecieveMessageFromTargetQueue]
AS
BEGIN
declare
@message_body xml,
@message_type_name nvarchar(256),
@conversation_handle uniqueidentifier,
@messagetypename nvarchar(256);
WHILE 1=1
BEGIN
BEGIN TRANSACTION
WAITFOR(
RECEIVE TOP(1)
@message_body = CAST(message_body as xml),
@message_type_name = message_type_name,
@conversation_handle = conversation_handle,
@messagetypename = message_type_name
FROM DwhInsertSmsQueue
), TIMEOUT 1000;
IF (@@ROWCOUNT = 0)
BEGIN
ROLLBACK TRANSACTION
BREAK
END
IF (@messagetypename = '//initiator')
BEGIN
IF OBJECT_ID('MyDatabase..MyExampleTableHelloThere') IS NOT NULL
DROP TABLE dbo.MyExampleTableHelloThere
SELECT @message_body.value('(/ExampleRoot/"elementNum1")[1]', 'VARCHAR(50)') AS MyExampleMessage
INTO dbo.MyExampleTableHelloThere
END
IF (@messagetypename = 'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog')
BEGIN
END CONVERSATION @conversation_handle;
END
COMMIT TRANSACTION
END
END
Secondo passaggio: consentire a TargetQueue di eseguire automaticamente la procedura:
USE [MyDatabase]
ALTER QUEUE [dbo].[TargetQueue] WITH STATUS = ON , RETENTION = OFF ,
ACTIVATION
( STATUS = ON , --activation status
PROCEDURE_NAME = dbo.p_RecieveMessageFromTargetQueue , --procedure name
MAX_QUEUE_READERS = 1 , --number of readers
EXECUTE AS SELF )