基于Service Broker的异步消息传递

这里演示同一个SQL Server中不同数据库之间的基于Service Broker的异步消息传递,其中Stored Procedure充当Service Program。HelloWorldDB为目标数据库,DotNetFun2则为消息发送发的数据库。

同时,假设Server Broker的基本对象类型已经创建,如MessageType(XMLMessage), Contract(XMLContract), Queue(SendingQueue and ReceivingQueue)等等,具体操作可以参考《A simple tutorial on SQL Server 2005 Beta 2 Service Broker》。另外,因为在不同的Databases之间进行消息传递,因此需要创建Route,具体操作可以参考《SQL Server 2005 Beta 2 Service Broker: Create Route》。

1.创建Stored Procedure作为Internal Service Program.

USE HelloWorldDB
GO
Alter Procedure HelloWorldResponder
As
Begin
Declare @conversationHandle UNIQUEIDENTIFIER
Declare @message_body nvarchar(MAX)
Declare @message_type_name SYSNAME
WHILE (1=1)
BEGIN
BEGIN TRANSACTION
-- Wait for 1 seconds for messages to arrive
WAITFOR (
-- For simplicity we process one message at a time
RECEIVE TOP(1)
@message_type_name=message_type_name,
@conversationHandle=conversation_handle,
@message_body=message_body
FROM [ReceivingQueue]), TIMEOUT 1000
-- If a message was received, process it, else skip
IF (@@rowcount <= 0)
BREAK;
-- If this is a XML message,
-- respond with an appropriate greeting
IF @message_type_name = 'XMLMessage'
BEGIN
SEND ON CONVERSATION @conversationHandle
MESSAGE TYPE XMLMessage
('<hello>Hello From Rickie</hello>')
END CONVERSATION @conversationHandle
END
COMMIT
END
COMMIT
END
GO

该Stored Procedure负责从ReceivingQueue中检索消息,并根据Queue的Retention设置,来确定从Queue中移除消息或更新Queue中消息的状态。

2.设置目标队列(Target Queue)的激活机制

Use HelloWorldDB
go
ALTER QUEUE [ReceivingQueue] WITH
ACTIVATION (
STATUS = ON, -- Turn on internal activation
PROCEDURE_NAME = [HelloWorldResponder], -- Our stored proc
MAX_QUEUE_READERS = 4, -- Up to 4 concurrent readers
EXECUTE AS SELF) -- Execute as user of incoming dialog

设置上述创建的Stored Procedure,该Stored Procedure将被激活并处理Queue中的消息。

3.在Initiator端发送消息

Use DotNetFun2
go
DECLARE @conversationHandle uniqueidentifier
BEGIN TRANSACTION
-- Begin a dialog to the Hello World Service
BEGIN DIALOG @conversationHandle
FROM SERVICE  [SendingService]
TO SERVICE   'ReceivingService','a727462b-52e7-4405-9eee-d19923729790'
ON CONTRACT   [XMLContract]
WITH ENCRYPTION = OFF, LIFETIME = 600;
-- Send message
SEND ON CONVERSATION @conversationHandle
MESSAGE TYPE [XMLMessage]
('<hello>Welcome to Rickie Lee''s blog, www.cnblogs.com/rickie</hello>');
Select * From sys.conversation_endpoints
COMMIT

其中,TO SERVICE 'ReceivingService','a727462b-52e7-4405-9eee-d19923729790',’ReceivingSerice’表示目标Service名称,'a727462b-52e7-4405-9eee-d19923729790'则指定目标Service所在的数据库,可以通过如下SQL Script获取:

-- Retrieve remote broker instance guid
SELECT service_broker_guid
FROM sys.databases
WHERE database_id = DB_ID('HelloWorldDB')

另外,可以通过如下的SQL script来检测Initiator端收到的Reply消息:

Select cast(message_body as XML) From SendingQueue
Receive message_type_name,
cast(message_body as XML)
From SendingQueue

4.查询对话端点状态(State of Conversation Endpoints)

最后,可以通过在Target/Initiator端查询sys.conversation_endpoints表,获取Dialog对话状态:

Select * From sys.conversation_endpoints

时间: 2024-08-30 11:59:29

基于Service Broker的异步消息传递的相关文章

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

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

SQL Server 2005 Service Broker 初探

本文概述了如何利用 SQL Server 2005 中新增的 Service Broker 功能,加快并简化基于异步排队操作的 SQL Server 应用程序的开发过程.(请注意,在示例文件中,程序员的注释使用的是英文,本文中将其译为中文是为了便于读者理解.) 一.引言 SQL Server 2005 的一个主要成就是可以实现可靠.可扩展且功能完善的数据库应用程序.与 .NET Framework 2.0 公共语言运行库 (CLR) 的集成使开发人员可以将重要的业务逻辑与存储过程合并,而 T-S

基于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

一起谈.NET技术,基于SQL Server 2008 Service Broker构建企业级消息系统

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

RDS SQL Server死锁(Deadlock)系列之四利用Service Broker事件通知捕获死锁

问题引入 在前面三篇文章,我们分别谈到了使用DBCC命令捕获死锁:使用Profiler界面跟踪Deadlock Graph事件捕获死锁和使用脚本自动部署Profiler Trace捕获死锁.这篇文章介绍一个非常有意思的捕获死锁的方法:使用SQL Server Service Broker Event Notification来捕获死锁. Service Broker Event Notification Service Broker Event Notification即使用SQL Server

使用Spring JMS轻松实现异步消息传递

异步进程通信是面向服务架构(SOA)一个重要的组成部分,因为企业里很多系统通信,特别是与外部组织间的通信,实质上都是异步的.Java消息服务(JMS)是用于编写使用异步消息传递的JEE应用程序的API.传统的使用JMS API进行消息传递的实现包括多个步骤,例如JNDI查询队列连接工厂和Queue资源,在实际发送和接收消息前创建一个JMS会话. Spring框架则简化了使用JEE组件(包括JMS)的任务.它提供的模板机制隐藏了典型的JMS实现的细节,这样开发人员可以集中精力放在处理消息的实际工作

Android基于service实现音乐的后台播放功能示例_Android

本文实例讲述了Android基于service实现音乐的后台播放功能.分享给大家供大家参考,具体如下: Service是一个生命周期长且没有用户界面的程序,当程序在各个activity中切换的时候,我们可以利用service来实现背景音乐的播放,即使当程序退出到后台的时候,音乐依然在播放.下面我们给出具体例子的实现: 当然,首先要在资源文件夹中添加一首MP3歌曲: 要实现音乐的播放,需要在界面中放置两个按钮,用来控制音乐的播放和停止,通过使用startService和stopService来实现

Android基于Service的音乐播放器_Android

本文开发一个基于Service的音乐播放器,音乐由后台运行的Service负责播放,当后台的播放状态发生变化时,程序将会通过发送广播通知前台Activity更新界面:当点击Activity的界面按钮时,系统将通过发送广播通知后台Service来改变播放状态. 前台Activity界面有两个按钮,分别用于控制播放/暂停.停止,另外还有两个文本框,用于显示正在播放的歌曲名.歌手名.前台Activity的代码如下: public class MainActivity extends AppCompat

基于redis的邮件异步发送

基于redis的邮件异步发送 相关工具和内容 安装Redis服务 编写Yii2的插件类 重写SwiftMailer类的方法 提交compsoer 提交至github 提交至composer 测试使用composer下载 安装redis服务 redis官网reids.io 下载地址 当前稳定版本链接http://download.redis.io/releases/redis-4.0.1.tar.gz mkdir redis cd redis wget http://download.redis.