簡體   English   中英

SQL Server Service Broker-消息超時

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM