-
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
--下面将创建一个向数据库添加员工的简单示例。
--需求是能够让初级人力资源员工向公司的人力资源系统添加记录。因为它的经理需要在记录得到一个永远的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
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式