Service Broker Services’ Example

Bob 在課堂上示範的 SQL Server 2005 Service Broker Services:

— 簡單呈現 queue 基本的用途。寄件者寄發一張明信片給收信者
— 收信者需要一個郵箱等待信件到達,並讀取該明信片

use master

drop database OneWay
go

— 建一個 DB 來存放範例
Create database OneWay
go

use OneWay
go

— 從一個服務寄發明信片到另一個服務
— 需要定義該明信片的型態
Create Message Type PostCard
validation = none
go

— 需要以協約(contract)來定義
— 明信片只可以被寄發,特別強調
— 只有 INITIATOR 可以寄明信片
create Contract Mail
(
PostCard SENT BY INITIATOR
)
go

— 建立 queues,寄件者也需要 Queue
— 雖然我們的範例只有單向將明信片寄發
— 但所有的服務參予者都需要一個 queue
— 以接收 Broker Services 所發送的錯誤訊息

— 用來發送訊息的 Queue postcards
create QUEUE PostOffice
— 用來收明信片的 Queue
create QUEUE MailBox

— 訊息只能在 Service 之間寄送
— 寄發者的 Queue 可能會收到傳
–遞間發生的錯誤
Create service Sender ON QUEUE PostOffice

— Receiver 被定義成要收明信片
— 所以它需要一個協定(contract)來告知
— 它可以收明信片。Receiver 將會透過
— MailBox Queue 來收明信片。而這個協定也只准
— 明信片寄到這個 MailBox,帳單和垃圾郵件都不可以進來
Create service Receiver ON QUEUE MailBox (Mail)

— 寄送東西時需要一個 dialog
— 需要一個變數來存放
— dialog identifier
declare @dialog uniqueidentifier
— 在送和收者之間必須要開啟一個 dialog
— 奇怪的是 Sender 服務不需要用單引號刮起來
— 但 Receiver 需要
BEGIN DIALOG @dialog FROM SERVICE Sender TO SERVICE ‘Receiver’
ON CONTRACT Mail
print N’Dialog Identifier:’ + CONVERT(nvarchar(100),@dialog)

— 現在可以寄送一張明信片
— 撰寫一段訊息
declare @message nvarchar(max)
set @message = N’期盼妳也在這裡’

— 放一些訊息到明信片並寄發
— 透過先前的 @dialog 告知 Service Broker
— 由誰寄送給誰
;send ON CONVERSATION @dialog MESSAGE TYPE PostCard
(convert(varbinary(max), @message))

SELECT * FROM MailBox

— >>>>>>>>>>>>>>>>>>>>>> Test 1, 透過 queue 收信<<<<<<<<<<<<<<<<<<<<<

— 透過變數來存放訊息
declare @postcardMessage varbinary(max)
— 等待有訊息寄到 MailBox Queue,也可以顛倒執行順序
— 先利用這條連線等待,再利用另一條連線執行之前寄信的
— 語法
WAITFOR (
receive TOP(1) @postcardMessage = message_body
from MailBox )

— 呈現透過 Queue 讀到的明信片訊息
print convert(nvarchar(max), @postcardMessage)

 

— >>>>>>>>>>>>>> Test 2, 送一個訊息,但讓它逾時<<<<<<<<<<<<<<<<<<<<<<<<<
— 呈現 senders 的 queue 將會收到錯誤訊息,
— 不是一般函數的回傳值

— 嘗試再送一次訊息
— 但包含逾時設定,且不讀取 MailBox Queue 的內容
declare @dialog uniqueidentifier

BEGIN DIALOG @dialog FROM SERVICE Sender TO SERVICE ‘Receiver’
ON CONTRACT Mail with LIFETIME = 2

— 寄送一個訊息
declare @message nvarchar(max)
set @message = N’期盼妳也在這裡’

;send ON CONVERSATION @dialog MESSAGE TYPE PostCard
(convert(varbinary(max), @message))

 

— 不處理 MailBox Queue 內的訊息,
— 但看寄發者 PostOffice Queue 的內容
SELECT * FROM PostOffice

declare @messageBody varbinary(max)
declare @messageType nvarchar(256)
WAITFOR (
receive TOP(1) @messageType = message_type_name, @messageBody = message_body
from PostOffice )

— 檢視所收到的錯誤訊息內容
print @messageType
print convert(nvarchar(max), @messageBody)

— 這也是為何單向的訊息寄發卻要求兩邊都須具備 Queue
— Sender 必須要有 Queue 來接收錯誤訊息

SELECT * FROM sys.conversation_endpoints
END CONVERSATION ‘a46b0099-925c-4ffe-bbac-29f8d574f28d’

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s

%d 位部落客按了讚: