SSB(SQLservice Service Broker) 入门实例介绍_MsSql

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 都是纯手工输入,可能还存在错误(虽然校验了两遍),如果发生错误,对不起大家了。)

时间: 2025-01-20 21:37:44

SSB(SQLservice Service Broker) 入门实例介绍_MsSql的相关文章

SSB(SQLservice Service Broker) 入门实例介绍

step 1:perpar database & data复制代码 代码如下:use mastergoCreate database Inventorygouse InventorygoCreate table inventory(    TitleId nvarchar(6) not null,    Quantity int not null,    primary key (TitleId,Quantity));go insert inventory values ('pc1001',10

Web Service单元测试工具实例介绍之SoapUI

原文  Web Service单元测试工具实例介绍之SoapUI SoapUI是当前比较简单实用的开源Web Service测试工具,提供桌面应用程序和IDE插件程序两种使用方式.能够快速构建项目和组织测试用例是该工具的一大特性,下面将通过实例介绍如果使用SoapUI进行Web Service单元测试. l        构建项目 SoapUI工具中的项目(Project)是由一个或多个Web Service组成的,这里我们以"中国电视节目预告 Web 服务: http://www.webxml

Azure Services Platform Step by Step 六 Service Bus入门实例

本节通过简短的语言讲解Microsoft .NET Services (Dec 2008 CTP) SDK里的实例,向大家展示Service Bus的入门知识. 没有安装Microsoft .NET Services (Dec 2008 CTP) SDK的朋友直接直接下载本文附件使用. 使用实例: 首先,打开Microsoft .NET Services (Dec 2008 CTP) SDK\Samples\ServiceBus\GettingStarted\Echo\CS35\ 目录下的Vis

【Azure Services Platform Step by Step-第6篇】Service Bus 入门实例

本节通过简短的语言讲解Microsoft .NET Services (Dec 2008 CTP) SDK里的实例,向大家展示Service Bus的入门知识. 没有安装Microsoft .NET Services (Dec 2008 CTP) SDK的朋友直接直接下载本文附件使用. 使用实例: 首先,打开Microsoft .NET Services (Dec 2008 CTP) SDKSamplesServiceBusGettingStartedEchoCS35 目录下的Visual St

SQLServer导出数据到MySQL实例介绍_MsSql

1从SQLServer导出数据 执行BCP: bcp "..." queryout "F:\test.txt" -c –S1.2.3.4 -Usa -P1111 命令参数含义: (1) 导入. 这个动作使用in命令完成,后面跟需要导入的文件名. (2) 导出. 这个动作使用out命令完成,后面跟需要导出的文件名. (3) 使用SQL语句导出. 这个动作使用queryout命令完成,它跟out类似,只是数据源不是表或视图名,而是SQL语句. (4) 导出格式文件. 这

myeclipse下hibernate入门实例介绍

myeclipse下hibernate初步实例 说明:本例采用myeclipse+sqlserver2000 hibernate版本为3.0. 数据库驱动为:jtds-1.0.2. 1.配置myeclipse环境(eclipse-SDK- 3.1.1+myeclipse4.1.1GA_E3.1). 2.配置好sqlserver2000数据库:建立数据库:goto . 表 test_products CREATE TABLE [dbo].[test_products] ( [id] [int] I

SQl Function 创建函数实例介绍_MsSql

 在SQL中系统已为我们提供了很非常丰富的函数:例:聚会函数avg, sum,count,max,min 日期函数:Day,Month,Year等等  为我们日常开发节省很多时间  但是有一些特殊需求的话SQL 也提供自己创建函数的功能下面举一小例子:需求: 某一订单表 编号,订单号,产品名称 要知道 某一订单号的产品名称 名称之间用逗号(,)隔开 如下图: 我们创建一个标题函数: StrName 创建过程类似创建存储过程 如下: 点击右键创建 表值函数与标量函数 从名称就可以分出来  一个返回

MSSQL - 应用案例 - Event Notification + Service Broker构建死锁自动收集系统

title: MSSQL - 应用案例 - Event Notification + Service Broker构建死锁自动收集系统 author: 风移 摘要 这篇文章介绍SQL Server的一个典型的应用案例,即如何利用Event Notification与Service Broker技术相结合来实现死锁信息自动收集系统.通过这个系统,我们可以全面把控SQL Server数据库环境中所有实例上发生的死锁详细信息,供我们后期分析和解决死锁场景. 死锁自动收集系统需求分析 当 SQL Ser

基于SQL Serve“.NET技术”r 2008 Service Broker构建企业级消息系统

1.引言 Microsoft 在SQL Server 2005引入了服务代理 (Service Broker 简称SSB) 为技术支持代理设计模式和面向消息的中间件 (MOM) 的原则.Service Broker在SQL Server 2008上得到完善, SQL Server Service Broker 为消息和队列应用程序提供 SQL Server 数据库引擎本机支持. 这使开发人员可以轻松地创建使用数据库引擎组件在完全不同的数据库之间进行通信的复杂应用程序.开发人员可以使用 Servi