Microsoft SQL Server
서비스 중개인
수색…
1. 기본 사항
서비스 브로커는 두 개 이상의 엔터티 간의 비동기 통신을 기반으로하는 기술입니다. 서비스 브로커는 메시지 유형, 계약, 대기열, 서비스, 라우트 및 적어도 인스턴스 엔드 포인트로 구성됩니다.
기타 : https://msdn.microsoft.com/en-us/library/bb522893.aspx
2. 데이터베이스에서 서비스 브로커 활성화
ALTER DATABASE [MyDatabase] SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE;
3. 데이터베이스에 대한 기본 서비스 브로커 생성 (단일 데이터베이스 통신)
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
우리는 하나의 데이터베이스 통신을위한 경로가 필요하지 않습니다.
4. 서비스 브로커를 통한 기본 통신 방법
이 데모에서는이 설명서의 다른 부분에서 작성한 서비스 중개자 구성을 사용합니다. 언급 된 부분의 이름은 3 입니다. 데이터베이스에 기본 서비스 브로커 구성을 만듭니다 (단일 데이터베이스 통신) .
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;
이 대화가 끝나면 TargetQueue에 msg가 생깁니다.
5. 자동으로 TargetQueue로부터 대화를받는 방법
이 데모에서는이 설명서의 다른 부분에서 작성한 서비스 중개자 구성을 사용합니다. 언급 된 부분을 호출합니다. 3. 데이터베이스에서 기본 서비스 브로커 구성을 만듭니다 (단일 데이터베이스 통신) .
먼저 큐의 데이터를 읽고 처리 할 수있는 프로 시저를 만들어야합니다.
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
두 번째 단계 : TargetQueue가 자동으로 프로 시저를 실행하도록 허용하십시오.
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 )
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow