成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Service Broker基礎(chǔ)應(yīng)用(上)

數(shù)據(jù)庫 SQL Server
本文主要涉及Service Broker的基本概念及建立一個(gè)Service Broker應(yīng)用程序的基本步驟。

導(dǎo)讀:本文主要涉及Service Broker的基本概念及建立一個(gè)Service Broker應(yīng)用程序的基本步驟。

一、前言

Service Broker為SQL Server提供消息隊(duì)列,這提供了從數(shù)據(jù)庫中發(fā)送異步事務(wù)性消息隊(duì)列的方法。Service Broker消息可以保證以適當(dāng)?shù)捻樞蚧蛟嫉陌l(fā)送順序不重復(fù)地一次性接收。并且因?yàn)閮?nèi)建在SQL Server中,這些消息在數(shù)據(jù)庫發(fā)生故障時(shí)是可以恢復(fù)的,也可以隨數(shù)據(jù)庫一起備份。在SQL Server 2008中,還引入了使用Create Broker Priority命令對會話設(shè)定優(yōu)先級,可以對重要的或不重要的會話進(jìn)行優(yōu)先級設(shè)定,以保證消息合理地處理。

本文假定一個(gè)在線數(shù)據(jù)庫BookStore中存儲了一些業(yè)務(wù)訂單。我們使用Service Broker應(yīng)用程序?qū)⑾l(fā)送到另一個(gè)數(shù)據(jù)庫BookDistribution,該數(shù)據(jù)庫是分離的應(yīng)用程序調(diào)用,該應(yīng)用程序控制倉庫入庫和出庫交付, 并返回消息給BookStore。

創(chuàng)建Service Broker應(yīng)用程序大體步驟如下:

1、定義希望應(yīng)用程序執(zhí)行的異步任務(wù)。

2、確定Service Broker的發(fā)起方服務(wù)和目標(biāo)服務(wù)是否創(chuàng)建在同一個(gè)SQL Server實(shí)例中。如果是兩個(gè)實(shí)例,實(shí)例間的通信還需要?jiǎng)?chuàng)建經(jīng)過證書認(rèn)證或NT安全的身份認(rèn)證,并且要?jiǎng)?chuàng)建端點(diǎn)、路由以及對話安全模式。

3、如果沒有啟用,則在多方參與的數(shù)據(jù)庫中使用Alter Database命令設(shè)置Enable_broker以及Truseworthy數(shù)據(jù)庫選項(xiàng)。

4、為所有多方參與的數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)庫主密鑰。

5、創(chuàng)建希望在服務(wù)之間發(fā)送的消息類型。

6、創(chuàng)建契約(Contract)來定義可以由發(fā)起方發(fā)送的各種消息以及由目標(biāo)發(fā)送的消息類型的種類。

7、同時(shí)在兩方參與的數(shù)據(jù)庫中創(chuàng)建用于保存消息的隊(duì)列。

8、同時(shí)在綁定特定約定到特定隊(duì)列的多方參與的數(shù)據(jù)庫中創(chuàng)建服務(wù)。

二、實(shí)例

下面我們通過一個(gè)示例來實(shí)現(xiàn)以上步驟:

(一)、啟用數(shù)據(jù)庫的Service Broker活動(dòng)

-- Enabling Databases for Service Broker Activity

USE master
GO
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = 'BookStore')
CREATE DATABASE BookStore
GO
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = 'BookDistribution')
CREATE DATABASE BookDistribution
GO
ALTER DATABASE BookStore SET ENABLE_BROKER
GO
ALTER DATABASE BookStore SET TRUSTWORTHY ON
GO
ALTER DATABASE BookDistribution SET ENABLE_BROKER
GO
ALTER DATABASE BookDistribution SET TRUSTWORTHY ON

(二)、創(chuàng)建數(shù)據(jù)庫主密鑰

-- Creating the DatabaseMaster Key for Encryption

USE BookStore
GO
CREATE MASTER KEY
ENCRYPTION
BY PASSWORD = 'I5Q7w1d3'
GO

USE BookDistribution
GO
CREATE MASTER KEY
ENCRYPTION
BY PASSWORD = 'D1J3q5z8X6y4'
GO

(三)、管理消息類型

使用CREATE MESSAGE TYPE(http://msdn.microsoft.com/en-us/library/ms187744.aspx)命令,

-- Managing Message Types

Use BookStore
GO
-- 發(fā)送圖書訂單的消息類型
CREATE MESSAGE TYPE [//SackConsulting/SendBookOrder]
VALIDATION
= WELL_FORMED_XML
GO

--目標(biāo)數(shù)據(jù)庫發(fā)送的消息類型
CREATE MESSAGE TYPE [//SackConsulting/BookOrderReceived]
VALIDATION
= WELL_FORMED_XML
GO

--執(zhí)行同樣的定義
Use BookDistribution
GO
-- 發(fā)送圖書訂單的消息類型
CREATE MESSAGE TYPE [//SackConsulting/SendBookOrder]
VALIDATION
= WELL_FORMED_XML
GO

--目標(biāo)數(shù)據(jù)庫發(fā)送的消息類型
CREATE MESSAGE TYPE [//SackConsulting/BookOrderReceived]
VALIDATION
= WELL_FORMED_XML
GO

--注意,此處沒有定義消息的內(nèi)容。實(shí)際的消息是消息類型的實(shí)例。

(四)、創(chuàng)建契約(Contract)

使用Create Contract(http://msdn.microsoft.com/en-us/library/ms178528.aspx

-- Creating Contracts

Use BookStore
GO
CREATE CONTRACT
[//SackConsulting/BookOrderContract]
(
[//SackConsulting/SendBookOrder]
SENT
BY INITIATOR,
[//SackConsulting/BookOrderReceived]
SENT
BY TARGET
)
GO

USE BookDistribution
GO
CREATE CONTRACT
[//SackConsulting/BookOrderContract]
(
[//SackConsulting/SendBookOrder]
SENT
BY INITIATOR,
[//SackConsulting/BookOrderReceived]
SENT
BY TARGET
)
GO

--發(fā)起方和目標(biāo)的定義必須相同

(五)、創(chuàng)建隊(duì)列

隊(duì)列用來保存數(shù)據(jù)。使用命令Create queue(http://msdn.microsoft.com/en-us/library/ms190495.aspx

-- Creating Queues

Use BookStore
GO
--保存BookDistribution過來的消息
CREATE QUEUE BookStoreQueue
WITH STATUS=ON
GO

USE BookDistribution
GO
--保存BookStore過來的消息
CREATE QUEUE BookDistributionQueue
WITH STATUS=ON
GO

(六)、創(chuàng)建服務(wù)

服務(wù)定義端點(diǎn),然后使用它來將消息隊(duì)列綁定到一個(gè)或多個(gè)契約上。服務(wù)使用隊(duì)列和契約來定義一個(gè)或一組任務(wù)。有點(diǎn)拗口,是不是?

服務(wù)是消息的發(fā)起方和接收方強(qiáng)制約定的規(guī)則,并將消息路由到正確的序列。

使用Create Service(http://msdn.microsoft.com/en-us/library/ms190332.aspx)命令。

-- Creating Services

Use BookStore
GO
CREATE SERVICE [//SackConsulting/BookOrderService]
ON QUEUE dbo.BookStoreQueue--指定的隊(duì)列綁定到契約
([//SackConsulting/BookOrderContract])
GO

USE BookDistribution
GO
CREATE SERVICE [//SackConsulting/BookDistributionService]
ON QUEUE dbo.BookDistributionQueue--指定的隊(duì)列綁定到契約
([//SackConsulting/BookOrderContract])
GO

(七)、啟動(dòng)對話

對話會話(dialog conservation)是在服務(wù)之間進(jìn)行消息交換的操作。

使用Begin Dialog Conversation(http://msdn.microsoft.com/en-us/library/ms187377.aspx) 命令創(chuàng)建新的會話。使用Send(http://msdn.microsoft.com/en-us/library/ms188407.aspx)來發(fā)送消息。使用End Conversation命令(http://msdn.microsoft.com/en-us/library/ms177521.aspx)結(jié)束會話。

-- Initiating a Dialog

Use BookStore
GO

--保存會話句柄和訂單信息
DECLARE @Conv_Handler uniqueidentifier
DECLARE @OrderMsg xml;

BEGIN DIALOG CONVERSATION @Conv_Handler--創(chuàng)建會話
FROM SERVICE [//SackConsulting/BookOrderService]
TO SERVICE '//SackConsulting/BookDistributionService'
ON CONTRACT [//SackConsulting/BookOrderContract];
SET @OrderMsg =
'<order id="3439" customer="22" orderdate="2/15/2011">
<LineItem ItemNumber="1" ISBN="1-59059-592-0" Quantity="1" />
</order>
';
SEND
ON CONVERSATION @Conv_Handler--發(fā)送到BookDistribution數(shù)據(jù)庫的隊(duì)列中
MESSAGE TYPE [//SackConsulting/SendBookOrder]
(
@OrderMsg);

(八)、查詢隊(duì)列中傳入的消息

-- Querying the Queue for IncomingMessages

USE BookDistribution
GO
SELECT message_type_name, CAST(message_body as xml) message,
queuing_order, conversation_handle, conversation_group_id
FROM dbo.BookDistributionQueue

查詢結(jié)果:

(九)、檢索并響應(yīng)消息

使用Receive語句(http://msdn.microsoft.com/en-us/library/ms186963.aspx)從隊(duì)列中讀取行(消息),也可以刪除已經(jīng)讀取的消息。Receive的結(jié)果可以填充到常規(guī)表中,也可以在局部變量中執(zhí)行其他操作,或發(fā)送到其他service Broker消息。如果消息是XML數(shù)據(jù)類型的消息,則可以直接借助TSQL的XQuery來操作。

-- Receiving and Responding to aMessage

USE BookDistribution
GO
--創(chuàng)建一個(gè)表存放接收到的訂單信息
CREATE TABLE dbo.BookOrderReceived
(BookOrderReceivedID
int IDENTITY (1,1) NOT NULL,
conversation_handle
uniqueidentifier NOT NULL,
conversation_group_id
uniqueidentifier NOT NULL,
message_body xml
NOT NULL)
GO

-- 聲明變量
DECLARE @Conv_Handler uniqueidentifier
DECLARE @Conv_Group uniqueidentifier
DECLARE @OrderMsg xml
DECLARE @TextResponseMsg varchar(8000)
DECLARE @ResponseMsg xml
DECLARE @OrderID int;

--從隊(duì)列中獲取消息,將接收值賦于局部變量
RECEIVE TOP(1) @OrderMsg = message_body,--TOP指定最多一條消息
@Conv_Handler = conversation_handle,
@Conv_Group = conversation_group_id
FROM dbo.BookDistributionQueue;

-- 將變量值插入表中
INSERT dbo.BookOrderReceived
(conversation_handle, conversation_group_id, message_body)
VALUES
(
@Conv_Handler,@Conv_Group, @OrderMsg )

-- 使用XQuery進(jìn)行抽取以響應(yīng)消息訂單
SELECT @OrderID = @OrderMsg.value('(/order/@id)[1]', 'int' )
SELECT @TextResponseMsg =
'<orderreceived id= "' +
CAST(@OrderID as varchar(10)) +
'"/>';
SELECT @ResponseMsg = CAST(@TextResponseMsg as xml);

-- 使用既有的會話句柄,發(fā)送響應(yīng)消息到發(fā)起方
SEND ON CONVERSATION @Conv_Handler
MESSAGE TYPE
[//SackConsulting/BookOrderReceived]

(十)、結(jié)束會話

-- Ending a Conversation

USE BookStore
GO
-- 創(chuàng)建訂單確認(rèn)表
CREATE TABLE dbo.BookOrderConfirmation
(BookOrderConfirmationID
int IDENTITY (1,1) NOT NULL,
conversation_handle
uniqueidentifier NOT NULL,
DateReceived
datetime NOT NULL DEFAULT GETDATE(),
message_body xml
NOT NULL)

DECLARE @Conv_Handler uniqueidentifier
DECLARE @Conv_Group uniqueidentifier
DECLARE @OrderMsg xml
DECLARE @TextResponseMsg varchar(8000);

RECEIVE
TOP(1) @Conv_Handler = conversation_handle,
@OrderMsg = message_body
FROM dbo.BookStoreQueue

INSERT dbo.BookOrderConfirmation
(conversation_handle, message_body)
VALUES (@Conv_Handler,@OrderMsg );

END CONVERSATION @Conv_Handler;
GO

USE BookDistribution
GO
DECLARE @Conv_Handler uniqueidentifier
DECLARE @Conv_Group uniqueidentifier
DECLARE @OrderMsg xml
DECLARE @message_type_name nvarchar(256);

RECEIVE
TOP(1) @Conv_Handler = conversation_handle,
@OrderMsg = message_body,
@message_type_name = message_type_name
FROM dbo.BookDistributionQueue

-- 雙方必須都結(jié)束會話
IF
@message_type_name = 'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
BEGIN
END CONVERSATION @Conv_Handler;
END

--查詢會話狀態(tài)

SELECT state_desc, conversation_handle
FROM sys.conversation_endpoints

三、小結(jié)

本文通過一個(gè)實(shí)例演示了一個(gè)用來發(fā)送圖書訂單消息分發(fā)控制數(shù)據(jù)庫的簡單的消息交換應(yīng)用程序。發(fā)起方發(fā)送圖書訂單,發(fā)回一個(gè)響應(yīng),并在兩個(gè)數(shù)據(jù)庫上使用END Conservation結(jié)束會話?,F(xiàn)實(shí)場景中可以轉(zhuǎn)換為其他消息類型、契約、服務(wù)和隊(duì)列。合理運(yùn)用Service Broker應(yīng)用程序的異步特性可以防止因應(yīng)用程序掛起而導(dǎo)致業(yè)務(wù)系統(tǒng)產(chǎn)生瓶頸。

原文鏈接:http://www.cnblogs.com/downmoon/archive/2011/04/05/2005900.html

【編輯推薦】

  1. 簡述Service Broker事件通知功能
  2. 一個(gè)Excel導(dǎo)入SQL Server的例子
  3. 優(yōu)化你的DiscuzNT,讓它跑起來
  4. 淺述當(dāng)前模式讀與一致性讀續(xù)
  5. 淺述當(dāng)前模式讀與一致性讀的區(qū)別

 

責(zé)任編輯:艾婧 來源: 博客園
相關(guān)推薦

2011-05-06 15:48:35

Service BroSQL Server

2015-03-30 14:57:03

paascloudfoundrservice bro

2011-05-06 15:00:52

Service BroSQL Server

2011-05-06 15:54:47

Service BroSQL Server

2015-03-30 15:15:00

CloudFoundrPaaS開源

2011-08-29 11:25:29

清空service bSQL Server

2011-07-06 15:33:02

ASP

2011-04-15 09:49:33

NAT

2021-06-02 08:07:59

LinuxService應(yīng)用

2016-09-20 21:32:16

DockerLinux Names

2014-06-05 10:21:29

HTTP

2020-12-22 06:05:43

Mbedtls應(yīng)用基礎(chǔ)

2010-06-13 15:28:56

UML基礎(chǔ)與應(yīng)用

2015-01-12 13:48:55

Android應(yīng)用組件

2022-08-31 09:21:40

MQTT BrokeOthers

2012-10-29 11:15:46

IBMdw

2016-07-29 10:37:00

互聯(lián)網(wǎng)httphtml

2018-07-12 11:48:31

微服務(wù)Service mes服務(wù)

2010-02-24 15:20:23

WCF Message

2010-01-12 16:20:44

VB.NET類
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久毛片 | 免费毛片网站在线观看 | 国产免费观看视频 | 日韩久草 | 老牛影视av一区二区在线观看 | 精品一区二区久久久久久久网站 | 欧美激情 亚洲 | 亚洲视频欧美视频 | 黑色丝袜三级在线播放 | 精品小视频 | 天天插天天射天天干 | 国精产品一区二区三区 | 91免费入口| 国产福利91精品一区二区三区 | 日日骚av| 午夜影院在线播放 | 中文字幕国产精品 | 精品免费国产一区二区三区四区 | 成人精品久久日伦片大全免费 | 刘亦菲国产毛片bd | 精品国产乱码久久久久久影片 | 黄色免费网站在线看 | 精品在线一区二区三区 | 久久久亚洲 | 殴美成人在线视频 | 无码一区二区三区视频 | 在线观看黄视频 | 国产1区2区在线观看 | 日韩在线国产 | 免费成人高清在线视频 | 成人免费在线 | 午夜三级视频 | 婷婷综合色 | 91精品国产色综合久久不卡98口 | 欧美日韩成人 | 国产免费黄网 | 人人九九精 | 国产成人区 | 国产91 在线播放 | 香蕉国产在线视频 | 久久精品国产亚洲一区二区 |