SSB(SQLservice Service Broker) 入门实例
前两天用了 MSsql里的 SSB委托机制,做了一个消息分发的小功能,在这里简单跟大家分享一下方法跟实例.
step 1:perpar database & data
use master
go
Create database Inventory
go
use Inventory
go
Create table inventory
(
TitleId nvarchar ( 6 ) not null ,
Quantity int not null ,
primary key (TitleId,Quantity)
);
go
insert inventory values ( ' pc1001 ' , 100 );
insert inventory values ( ' pc1002 ' , 200 );
insert inventory values ( ' pc1003 ' , 300 );
insert inventory values ( ' pc1004 ' , 400 );
step 2: 创建整个SSB的基础框架.
首先创建信息类型
Create Message Type [ //mark/v10/types/inventory ] Create Message Type [ //mark/v10/types/inventoryresponse ]
创建合约
Create contracts [ //mark/v10/contracts/inventorycontract ]
(
[ //mark/v10/types/inventory ] send by initiator,
[ //mark/v10/types/inventoryresponse] send by target
);
创建队列与服务
create queue [ inventory client queue ] ;
create service [ //mark/v10/services/inventory client ]
on queue [ inventory client queue ]
go
-- create inventory service
create queue [ inventory queue ] ;
create service [ //mark/v10/services/inventory ]
on queue [ inventory queue ]
(
[ //mark/v10/contracts/inventorycontract ]
);
step 3:发送消息到消息队列中
use Inventory
go
-- send message
begin transaction
declare @dialog_id uniqueidentifier
begin dialog conversation @dialog_id
from service [ //mark/v10/services/inventory client ]
to service ' //mark/v10/services/inventory '
on contract [ //mark/v10/contracts/inventorycontract ]
with encryption = off ;
send on conversation @dialog_id message type [ //mark/v10/types/inventory ]
(
' <InventoryUpdate>
<TitleId>pc1001</TitleId>
<Quantity>102</Quantity>
</InventoryUpdate> '
);
commit transaction ;
发送成功后,可以查询 inventory_queue
select conversation_handle, cast (message_body as xml) as conversation_body from [ Inventory queue ]
这里只是查询了两列。
其中conversation_body 就是 我们发出的信息了。
setp 4: 从 inventory queue 中获取信息并更新数据
use inventory
go
begin transaction
declare @dialog_id uniqueidentifier
declare @message_body xml
declare @amount int ;
declare @title nvarchar ( 128 );
receive
@dialog_id = conversation_handle,
@message_body = message_body
from [ dbo ] . [ Inventory queue ]
print ' handle is ' + cast ( @dialog_id as nvarchar ( 90 ))
print ' message body is ' + cast ( @message_body as nvarchar ( max ) )
if ( @dialog_id is not null )
begin
set @amount = @message_body .value( ' (/InventoryUpdate/Quantity)[1] ' , ' int ' );
set @title = @message_body .value( ' (/InventoryUpdate/TitleId)[1] ' , ' nvarchar(100) ' );
print ' a: ' + cast ( @amount as nvarchar ( 100 ))
print ' b: ' + @title ;
Update inventory set Quantity = @amount where TitleId = @title ;
end
end conversation @dialog_id ;
commit transaction ;
操作成功后再去查询inventory queue的表 犹豫里面的数据已经被receive 出来 就为空了。
数据同时被更新了
step 5: 接下来做个自动监听功能,只要有信息发送到队列,相关队列,就可以自动执行功能.
首先建立个存储过程,(把receive 中的那段代码拿过来就可以了)
use Inventory
go
-- create procedure to receive message and update table
create proc InventoryProc as
begin transaction
declare @dialog_id uniqueidentifier
declare @message_body xml
declare @amount int ;
declare @title nvarchar ( 128 );
waitfor (
receive
@dialog_id = conversation_handle,
@message_body = message_body
from [ dbo ] . [ Inventory queue ] ),timeout 5000 ;
print ' handle is ' + cast ( @dialog_id as nvarchar ( 90 ))
print ' message body is ' + cast ( @message_body as nvarchar ( max ) )
if ( @dialog_id is not null )
begin
set @amount = @message_body .value( ' (/InventoryUpdate/Quantity)[1] ' , ' int ' );
set @title = @message_body .value( ' (/InventoryUpdate/TitleId)[1] ' , ' nvarchar(100) ' );
print ' a: ' + cast ( @amount as nvarchar ( 100 ))
print ' b: ' + @title ;
Update inventory set Quantity = @amount where TitleId = @title ;
end
end conversation @dialog_id ;
commit transaction ;
go
队列监听
alter queue [ inventory queue ]
with activation(
status = on ,
procedure_name = InventoryProc,
max_queue_readers = 2 ,
execute as self
);
go
完成后,只要发送队列信息后,就可以了
PS: 我们定义了 两个队列 还有个 inventory client queue
这个队列保存的是成功或者error 提示。用receive 方法也可以提取出来。
select message_type_name from [ Inventory client queue ]
以上的 message type service 等信息 如图所示,都在这里.
以上是SSB的入门实例,以后会再写一篇实际应用上的(以上的sql code 都是纯手工输入,可能还存在错误(虽然校验了两遍),如果发生错误,对不起大家了。)
分类: SSB
标签: MSSQL , SSB
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于SSB(SQLservice Service Broker) 入门实例的详细内容...