[英]SQL Server Service Broker - Message Timeout
我正在研究sql服務器服務代理作為我們應用程序的消息處理技術。
在我們的方案中,從一個客戶端應用程序(WPF)發送的消息需要在服務代理中排隊,其他代理應用程序(android)會接收它們。 消息是時間敏感的,接收者需要在消息被發送到隊列后的“ X”分鍾(例如2分鍾)之內接收,如果到那時仍不能接收,則消息必須過期並從接收者中刪除。隊列。
有沒有辦法告訴服務代理在“ x”分鍾后使消息超時?
編輯:添加了我用來測試此腳本。
CREATE DATABASE ServiceBrokerTest
GO
ALTER DATABASE ServiceBrokerTest SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE
GO
/****** Object: MessageType [SampleMsgType] ***/
CREATE MESSAGE TYPE [SampleMsgType] AUTHORIZATION [dbo] VALIDATION = NONE
GO
/****** Object: ServiceContract [MsgContract] ******/
CREATE CONTRACT [MsgContract] AUTHORIZATION [dbo] ([SampleMsgType] SENT BY INITIATOR)
GO
/****** Object: ServiceQueue [dbo].[Queue1] ******/
CREATE QUEUE [dbo].[Queue1] WITH STATUS = ON , RETENTION = OFF , POISON_MESSAGE_HANDLING (STATUS = ON) ON [PRIMARY]
GO
/****** Object: BrokerService [MsgService] ******/
CREATE SERVICE [MsgService] AUTHORIZATION [dbo] ON QUEUE [dbo].[Queue1] ([MsgContract])
GO
/****** Object: StoredProcedure [dbo].[SendMsg] ******/
CREATE PROC [dbo].[SendMsg]
@msg NVARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON
DECLARE @handle UNIQUEIDENTIFIER
BEGIN TRANSACTION
BEGIN dialog @handle
FROM SERVICE [MsgService]
TO SERVICE 'MsgService'
ON CONTRACT [MsgContract]
WITH ENCRYPTION = OFF, LIFETIME = 20
;SEND ON CONVERSATION @handle
MESSAGE TYPE [SampleMsgType] (@msg)
END CONVERSATION @handle
COMMIT TRANSACTION
END
/****** Object: StoredProcedure [dbo].[ReceiveMsg] ******/
CREATE PROC [dbo].[ReceiveMsg]
@msg NVARCHAR(MAX) OUT
AS
BEGIN
SET NOCOUNT ON
DECLARE @handle UNIQUEIDENTIFIER
DECLARE @msgTable TABLE (
handle UNIQUEIDENTIFIER,
msg NVARCHAR(MAX),
msgType VARCHAR(300));
SET @handle = NULL
WAITFOR (
RECEIVE [conversation_handle], message_body, message_type_name
FROM [dbo].[Queue1]
INTO @msgTable
), TIMEOUT 25000
SELECT @handle = handle
FROM @msgTable
WHERE msgType = 'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
IF @handle is not null
BEGIN
END CONVERSATION @handle
END
SELECT @msg = msg
FROM @msgTable
WHERE msgType = 'SampleMsgType'
END
GO
對話框的生存期可以在BEGIN DIALOG
語句中指定:
BEGIN DIALOG @handle
FROM SERVICE [...]
TO SERVICE '...'
ON CONTRACT [...]
, LIFETIME = <dialog lifetime>;
對話框必須在其生存期內完成(雙方結束),否則將出錯。 因此,您可以啟動一個具有2分鍾生命周期的對話框,並在其上發送一個或多個消息。 目標必須在這2分鍾內接收並處理該消息,否則對話框將出錯。
您還可以使用對話優先級,並在優先級較高的通道上發送對時間敏感的消息。 這將確保Service Broker傳輸將優先級分配給您的敏感消息,並且客戶端應用程序RECEIVE語句會“冒泡”優先級較高的時間敏感消息,並首先接收它們。
在不使用對話框壽命的情況下實現所需目標的替代方法。
在消息有效負載中發送“ SentDate”,並在激活過程中處理“過期”消息。 這使您能夠顯式決定消息過期時的處理方式。 (即忽略過期的消息,記錄到錯誤表,通知發件人哪些消息遲到了等等。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.