我正在研究sql server服務代理作爲我們應用程序的消息處理技術。SQL Server服務代理 - 消息超時
在我們的場景中,從一個客戶端應用程序(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
感謝您的回覆。我按照你的建議嘗試過,但這些消息在設置的生命週期(25秒)後沒有過期。即使在25秒後,我仍能收到消息。我編輯了我的問題以包含我正在使用的腳本。如果我可以指出我在那裏做錯了什麼,那將會很棒。 – muruge
@muruge - 我相信你需要在對話的發起者一側留下對話框,以便獲取代理超時錯誤消息。 – etliens
@muruge - 你還在使用SSB的「消防和遺忘」反模式,Remus可以告訴你一切。 – etliens