日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
ServiceBroker基礎應用(上)

導讀:本文主要涉及Service Broker的基本概念及建立一個Service Broker應用程序的基本步驟。

創(chuàng)新互聯(lián)始終堅持【策劃先行,效果至上】的經(jīng)營理念,通過多達十多年累計超上千家客戶的網(wǎng)站建設總結(jié)了一套系統(tǒng)有效的全網(wǎng)推廣解決方案,現(xiàn)已廣泛運用于各行各業(yè)的客戶,其中包括:成都銅雕雕塑等企業(yè),備受客戶贊譽。

一、前言

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

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

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

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

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

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

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

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

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

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

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

二、實例

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

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

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

-- 目標數(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

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

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

(四)、創(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ā)起方和目標的定義必須相同

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

隊列用來保存數(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)建服務

服務定義端點,然后使用它來將消息隊列綁定到一個或多個契約上。服務使用隊列和契約來定義一個或一組任務。有點拗口,是不是?

服務是消息的發(fā)起方和接收方強制約定的規(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 -- 指定的隊列綁定到契約
( [ //SackConsulting/BookOrderContract ] )
GO

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

(七)、啟動對話

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

使用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 =
'

' ;
SEND ON CONVERSATION @Conv_Handler -- 發(fā)送到BookDistribution數(shù)據(jù)庫的隊列中
MESSAGE TYPE [ //SackConsulting/SendBookOrder ]
( @OrderMsg );

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

  
   --
    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é)果:

(九)、檢索并響應消息

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

  
   --
    Receiving and Responding to aMessage
   

USE BookDistribution
GO
-- 創(chuàng)建一個表存放接收到的訂單信息
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 ;

-- 從隊列中獲取消息,將接收值賦于局部變量
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進行抽取以響應消息訂單
SELECT @OrderID = @OrderMsg .value( ' (/order/@id)[1] ' , ' int ' )
SELECT @TextResponseMsg =
' ' ;
SELECT @ResponseMsg = CAST ( @TextResponseMsg as xml);

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

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

  
   --
    Ending a Conversation
   

USE BookStore
GO
-- 創(chuàng)建訂單確認表
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é)

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

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

【編輯推薦】

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

網(wǎng)站題目:ServiceBroker基礎應用(上)
文章路徑:http://www.dlmjj.cn/article/cdegjih.html