Server Broker

本文介绍了SQL Server 2005中新增的Service Broker功能,包括其作用、实现消息发送的过程及关键步骤,如创建数据库、允许Service Broker、创建消息类型、合约、队列和服务等。

Server Broker是SQL Server 2005中新增加功能。

一、简介(来自SQL 2K05的帮助文档)

       Microsoft SQL Server 2005 Service Broker 可以帮助开发人员生成可伸缩的、安全的数据库应用程序。此项新技术是 数据库引擎 的一部分,它提供一个基于消息的通信平台,使独立的应用程序组件可以作为一个整体来运行。Service Broker 包含用于异步编程的基础结构,可用于单个数据库或单个实例中的应用程序,也可用于分布式应用程序。

         Service Broker 提供了生成分布式应用程序所需的大部分基础结构,从而减少了应用程序的开发时间。利用 Service Broker ??还可以轻松缩放应用程序,以容纳应用程序接收的通信流量。

        Service Broker 是 Microsoft SQL Server 2005 中的新技术,它可帮助数据库开发人员构建安全、可靠且可伸缩的应用程序。由于 Service Broker 是数据库引擎 的组成部分,因此管理这些应用程序就成为数据库日常管理的一部分。

        Service Broker 为 SQL Server 提供队列和可靠的消息传递。Service Broker 对使用单个 SQL Server 实例的应用程序和在多个实例间分配工作的应用程序都适用。

        在单个 SQL Server 实例中,Service Broker 提供了可靠的异步编程模型。数据库应用程序通常使用异步编程来缩短交互式响应时间,并增加应用程序总吞吐量。

二、Server Broker实现消息的发送

       
(一)同一实例同一数据库下的消息发送

1.准备工作:

1.1创建数据库ssbDemo

use master
go

if exists( select top 1 1
    from sys.sysdatabases with(nolock)
    where name=N'ssbDemo'
   )
begin
drop database ssbDemo
end

create database ssbDemo
go

1.2 允许Server Broker

--check database broker states
declare @is_broker_enabled int
select top 1 @is_broker_enabled=is_broker_enabled
from sys.databases with (nolock)
where database_id=db_id(N'ssbDemo')

if @is_broker_enabled<>1
begin
--Enable SSB
alter database ssbDemo
set enable_broker
alter database ssbDemo
set trustworthy on 
end
1.3创建Master Key

use ssbDemo
go
create master key 
encryption by password = 'Cw24@$g'

2.创建消息

use ssbDemo
go
--Message
if exists (select top 1 1
    from sys.service_message_types with(nolock)
    where name='HelloWorldRequest')
begin
drop message type HelloWorldRequest;
end
go
create message type [HelloWorldRequest] VALIDATION=NONE

if exists (select top 1 1
    from sys.service_message_types with(nolock)
    where name='HelloWorldRespone')
begin
drop message type HelloWorldRespone;
end
go
create message type [HelloWorldRespone] VALIDATION=NONE

3.创建合约

--Contract
if exists (select top 1 1 
    from sys.service_contracts with(nolock)
    where name='HelloWorldContract')
begin 
drop contract HelloWorldContract;
end
go
create contract [HelloWorldContract]
(
[HelloWorldRequest] sent by initiator
,[HelloWorldRespone] sent by target
)
4.创建队列和基于队列的服务

--Queue
if object_id('dbo.HelloWorldTargerQueue') is not null and
exists(select top 1 1
    from sys.objects with (nolock) 
    where object_id=object_id('dbo.HelloWorldTargerQueue')
     and type='SQ')
begin
drop queue dbo.HelloWorldTargerQueue
end
go
create queue dbo.[HelloWorldTargetQueue]

if exists (select top 1 1 
    from sys.services with(nolock)
    where name='HelloWorldRequestService')
begin
drop service HelloWorldRequestService;
end
go
create service [HelloWorldRequestService] on queue [HelloWorldTargetQueue]
(
[HelloWorldContract]
)


if object_id('dbo.HelloWorldInitiatorQueue') is not null and
exists(select top 1 1
    from sys.objects with (nolock) 
    where object_id=object_id('dbo.HelloWorldInitiatorQueue')
     and type='SQ'
    )
begin
drop queue dbo.HelloWorldInitiatorQueue
end
go
Create queue dbo.[HelloWorldInitiatorQueue]
if exists (select top 1 1 
    from sys.services with(nolock)
    where name='HelloWorldResponseService')
begin
drop service HelloWorldResponseService;
end
go
create service [HelloWorldResponeService] on queue [HelloWorldInitiatorQueue]
(
[HelloWorldContract]
)

5.发送消息(Server Broker的消息发送,必须在事务中实现)

--send message
use ssbDemo
go
set nocount on
declare @conversionHandle uniqueidentifier
begin try
begin tran
--begin dialog to server
begin dialog @conversionHandle
from service [HelloWorldResponeService]
to service N'HelloWorldRequestService'
on contract [HelloWorldContract]
with encryption=off,lifetime=600;
--Send message
send on conversation @conversionHandle
message type [HelloWorldRequest] (N'Hello world')
commit
end try
begin catch
--get the the error info
select error_message()
end catch

6.接受消息(同样消息的接受也必须在事务中)

--receive message from raget queue
set nocount on
declare @conversionHandle uniqueidentifier
declare @message_body nvarchar(max)
declare @message_type_name sysname

--begin transaction
begin transaction
waitfor (receive top (1)--only a piece of message
@message_type_name = message_type_name--Receiving message type
,@conversionHandle=conversation_Handle--Dialog identifier
,@message_body=message_body
from [HelloWorldTargetQueue])

--it is a HelloWorldRequset
if @message_type_name=N'HelloWorldRequest'
begin
send on conversation @conversionHandle
message type HelloWorldRespone
(N'Hello from '+@@servername)
end conversation @conversionHandle
end
--commit 
commit tran
go

7.检验

7.1检查目标队列

use ssbDemo
go
--check the target queue
select * from [HelloWorldTargetQueue] with (nolock)
--go
----convert the message to nvarchar
select cast(message_body as nvarchar(max))
from [HelloWorldTargetQueue]
go
7.2检查消息接受情况

--Check receiving whether sucessfully or fail
select cast(message_body as nvarchar(max))
from [HelloWorldTargetQueue]
7.3检查消息的反应情况

--Checking response message from initiator queue
select cast(message_body as nvarchar(max))
from [HelloWorldInitiatorQueue]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值