您的位置:首页 > 数据库

sql server 2005中的Service broker小示例(未完善)

2009-04-17 17:31 183 查看
--Service broker示例
--下面将创建一个向数据库添加员工的简单示例。
--需求是能够让初级人力资源员工向公司的人力资源系统添加记录。因为它的经理需要在记录得到一个永远的ID之前查看记录,我们决定创建的应用程序把接收的记录在被审查之前都放在一个“贮藏”表中。
---在我的测试系统上,我创建了一个只含有Employee表的serviceBrokerExample数据库。那个表只含有一个名为EmployeeInfo的列,它的数据类型为XML,这是我应用程序接受的格式。利用以下代码可以在
--测试系统上创建这些对像:
--create db
--create database servicebrokerexample
go
--create table
use servicebrokerexample
go
create table employee
(
employeeinfo xml null
) on [primary]
go
--创建了这些后,就可以创建系统使用的消息类型了。这里我指定类型以确保数据是适当的XML格式,但在生产环境中通常需要引用一个完整的XML架构文件:
create message type
[serviceBroker/example/employee/addEmployee]
validation=well_formed_xml
--现在可以创建系统使用的约定了,会话的每一方都有。可以看出,其中使用了刚刚创建的AddEmployee消息类型:
create contract
[serviceBroker/example/employee/addEmployeeContract]
(
[serviceBroker/example/employee/addEmployee]
Sent by initiator
)
go
--下面就是我的从队列读取数据并插入到数据库的存储过程。这里使用的是XML转换函数把数据放置到数据库。有两个存储过程:其中一个插入,另一个检查并清空队列。
create proc addEmployee
@mb xml
as
insert into employee(employeeinfo)
values(@mb)
go

--读取队列的存储过程如下:
create proc ProcessEmployee
as
begin
begin tran
declare @ch uniqueidentifier
declare @mb varbinary(max)
waitfor
(
receive top (1) @ch=conversation_handle,@mb=message_body
from employeequeue
),
timeout 1500

execute addEmployee @mb
end conversation @ch
commit tran

end
--员工就位后需要创建存储数据的队列。创建队列时,需要关联一个用来处理它的服务程序(在本例中就是存储过程)
create queue [employeequeue]
with status=on,
activation
(
procedure_name=ProcessEmployee,
max_queue_readers=5,
execute as self
)
go
--现在差不多了,接下来需要创建应答会话请求的服务,并把它与前面的约定关联起来:
create service addemployeeservice
on queue [employeequeue]
(
[serviceBroker/example/employee/addEmployeeContract]
)
go
--现在系统准备好了,可以使用使用sql server management studio 检查这些对像。
--当服务器准备好service broker会话后,就可以开始一个完整的示例事件了。
--代码如下:发送
declare @ch uniqueidentifier
declare @employeename xml
set @employeename='<name>mary</name>'

begin dialog conversation @ch
from service addemployeeservice
to service
'[serviceBroker/example/employee/addEmployeeContract]'
on contract
[serviceBroker/example/employee/addEmployeeContract];

send on conversation @ch
message type
[serviceBroker/example/employee/addEmployee] (@employeename)

go

---接收
GO

DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;
DECLARE @RecvReqMsg NVARCHAR(100);
DECLARE @RecvReqMsgName sysname;

RECEIVE TOP(1)
@RecvReqDlgHandle = conversation_handle,
@RecvReqMsg = message_body,
@RecvReqMsgName = message_type_name
FROM [employeequeue];

SELECT @RecvReqMsg AS ReceivedRequestMsg;

IF @RecvReqMsgName =
N'serviceBroker/example/employee/addEmployee'
BEGIN
DECLARE @ReplyMsg NVARCHAR(100);
SELECT @ReplyMsg =
N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';

SEND ON CONVERSATION @RecvReqDlgHandle
MESSAGE TYPE
[serviceBroker/example/employee/addEmployee]
(@ReplyMsg);

END CONVERSATION @RecvReqDlgHandle;
END

SELECT @ReplyMsg AS SentReplyMsg;

--要检查的话,可以使用动态管理视图

select * from sys.dm_broker_activated_tasks
select * from sys.dm_broker_connections
select * from sys.dm_broker_forwarded_messages
select * from sys.dm_broker_queue_monitors
go
select * from employee
go
SELECT * FROM [dbo].[employeequeue]

GO
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: