VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 数据库 > T-SQL >
  • sql server 2005中的Service broker小示例(未完善)

--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
 
出处:https://www.cnblogs.com/chillsrc/archive/2009/04/17/1438195.html

相关教程