我正在研究SQL Server Service Broker,而我正在尝试理解来自服务和发送队列的观点。我见过的很多例子都是这样的。
-- Create Message Type
CREATE MESSAGE TYPE TestMessage
VALIDATION = NONE
GO
-- Create Contract
CREATE CONTRACT TestContract
(TestMessage SENT BY INITIATOR)
GO
-- Create Send Queue
CREATE QUEUE TestSendQueue
GO
-- Create Receive Queue
CREATE QUEUE TestReceiveQueue
GO
-- Create Send Service on Send Queue
CREATE SERVICE TestSendService
ON QUEUE TestSendQueue (TestContract)
GO
-- Create Receive Service on Recieve Queue
CREATE SERVICE TestReceiveService
ON QUEUE TestReceiveQueue (TestContract)
GO
DECLARE @dialog uniqueidentifier
DECLARE @message NVARCHAR(128)
BEGIN DIALOG CONVERSATION @dialog
FROM SERVICE TestSendService
TO SERVICE 'TestReceiveService'
ON CONTRACT TestContract
WITH ENCRYPTION = OFF
-- Send messages on Dialog
SET @message = N'Very First Message';
SEND ON CONVERSATION @dialog
MESSAGE TYPE TestMessage (@message)
GO
-- View messages from Receive Queue
SELECT CONVERT(NVARCHAR(MAX), message_body) AS Message
FROM TestReceiveQueue
GO
-- Receive messages from Receive Queue
RECEIVE TOP(1) CONVERT(NVARCHAR(MAX), message_body) AS Message
FROM TestReceiveQueue
GO
所以基本上在这个例子中,当我发送的消息进入TestReceiveQueue时,TestSendQueue和TestSendService的重点是什么,以及我从哪里查看和接收它?另外,为什么FROM SERVICE
中的BEGIN DIALOG
是一个字符串值而TO SERVICE
不是?
答案 0 :(得分:0)
您需要FROM SERVICE,因为'TestReceiveService'发送的回复需要收件人。应用程序在哪里寻找响应?
FROM服务是一个符号,因为它必须是本地的现有服务。它的存在可以并且将在执行/编译期间得到验证。
TO服务是一个字符串,因为它是一个远程名称,不一定在本地存在。它的位置通过路由解决。它在执行/编译期间无法验证。您的示例,当TO服务是本地的时,是一个退化的例子。为了更好地理解一些要求/语法和明显的异常,请尝试将每个示例视为远程示例(TO服务位于不同的计算机上)。