发送消息时,来自服务的重点是什么?

时间:2014-07-25 20:06:54

标签: sql-server service-broker

我正在研究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不是?

1 个答案:

答案 0 :(得分:0)

您需要FROM SERVICE,因为'TestReceiveService'发送的回复需要收件人。应用程序在哪里寻找响应?

FROM服务是一个符号,因为它必须是本地的现有服务。它的存在可以并且将在执行/编译期间得到验证。

TO服务是一个字符串,因为它是一个远程名称,不一定在本地存在。它的位置通过路由解决。它在执行/编译期间无法验证。您的示例,当TO服务是本地的时,是一个退化的例子。为了更好地理解一些要求/语法和明显的异常,请尝试将每个示例视为远程示例(TO服务位于不同的计算机上)。