-- 创建要使用的数据库
Create Database HelloWorldDB
go
Use HelloWorldDB
go
-- 创建要使用的两种消息类型。我们要使用的消息将是
-- 字符串而不是 XML - 因此无需进行验证
CREATE MESSAGE TYPE [HelloWorldRequest] VALIDATION = NONE
CREATE MESSAGE TYPE [HelloWorldResponse] VALIDATION = NONE
-- 创建一个限制此对话框中消息类型
-- 的规范。请求由对话框的初始化程序发出
-- 响应消息由对话框目标发送。
CREATE CONTRACT [HelloWorldContract]
(
[HelloWorldRequest] SENT BY initiator,
[HelloWorldResponse] SENT BY target
)
-- 创建对话框在其间通信的两个队列。A
-- 对话框请求两个队列。
CREATE QUEUE [HelloWorldTargetQueue]
CREATE QUEUE [HelloWorldInitiatorQueue]
-- 创建命名对话框端点的服务。服务会将
-- 会话端点连接到队列。
CREATE SERVICE [HelloWorldRequestService] ON QUEUE [HelloWorldTargetQueue]
(
[HelloWorldContract]
)
CREATE SERVICE [HelloWorldResponseService] ON QUEUE [HelloWorldInitiatorQueue]
go
Use HelloWorldDB
go
SET NOCOUNT ON
DECLARE @conversationHandle uniqueidentifier
Begin Transaction
-- 开始 Hello World 服务的对话
BEGIN DIALOG @conversationHandle
FROM SERVICE [HelloWorldResponseService]
TO SERVICE 'HelloWorldRequestService'
ON CONTRACT [HelloWorldContract]
WITH ENCRYPTION = OFF, LIFETIME = 600;
-- 发送消息
SEND ON CONVERSATION @conversationHandle
MESSAGE TYPE [HelloWorldRequest] (N'Hello World')
commit
Use HelloWorldDB
go
-- 检查目标队列以确认消息已送达
select * from [HelloWorldTargetQueue]
go
-- 将消息主体转换为字符串,以便我们查看其中包含的内容
select cast(message_body as nvarchar(MAX)) from [HelloWorldTargetQueue]
go
-- 使用 Receive 命令可从队列接收消息
-- 声明变量以存储接收到的数据
SET NOCOUNT ON
DECLARE @conversationHandle uniqueidentifier
declare @message_body nvarchar(MAX)
declare @message_type_name sysname;
-- Service Broker 命令总是位于事务中
Begin Transaction;
-- Receive 命令的格式类似于一个选择列表。首先列出
-- 要获取的列,然后指定要从中获取消息
-- 的队列
RECEIVE top(1) -- 只接收一条消息,因此我们可以直接保存到变量中。
@message_type_name=message_type_name,
-- 接收的消息类型
@conversationHandle=conversation_handle,
-- 对话的标识符
-- 我们通过下列语句接收该消息
@message_body=message_body
-- 作为
-- varbinary(MAX) blob 的消息内容
FROM [HelloWorldTargetQueue]
print @message_body
-- 如果这是一条 hello world 消息,则用相应的问候语回答
if @message_type_name = N'HelloWorldRequest'
Begin
SEND ON CONVERSATION @conversationHandle
-- 使用下列消息接收语句的相同会话
MESSAGE TYPE [HelloWorldResponse]
(N'Hello From '+@@servername )
-- 这是我们希望从初始化程序接收的唯一消息,因此
-- 现在可以安全地结束对话。
END CONVERSATION @conversationHandle
End
-- 提交事务
-- 如果此时我们回滚,所有内容将退回到
-- 我们开始时的状态 – 消息会返回到队列,并且没有发送响应
Commit
go
-- 确认我们从队列中删除了消息
select cast(message_body as nvarchar(MAX)) from [HelloWorldTargetQueue]
go
Use HelloWorldDB
go
select cast(message_body as nvarchar(MAX)) from [HelloWorldInitiatorQueue]
go
RECEIVE
cast(message_body as nvarchar(MAX))
FROM [HelloWorldInitiatorQueue]