我是 SQL Server 中 SERVICE BROKER 和 QUEUE 功能的新手。我一直在嘗試遵循一些示例:
- https://sqlperformance.com/2014/03/sql-performance/configuring-service-broker
- https://www.sqlshack.com/using-the-sql-server-service-broker-for-asynchronous-processing/
我可以讓手動處理作業得很好。如果我呼叫處理佇列的 SP,它會按預期作業。如果我理解正確,ACTIVATION, PROCEDURE_NAME為 QUEUE設定應該將其設定為自動處理發送到佇列的訊息。但是,這不是我在 SQL SERVER v12.0.6433.1 中看到的
BEGIN TRANSACTION;
CREATE TABLE #DONE
(
ID INT
);
CREATE MESSAGE TYPE CUSTOM_TYPE
AUTHORIZATION XYZ_USER
VALIDATION = NONE;
GO
CREATE CONTRACT POST_CUSTOM_TYPE_MESSAGE_CONTRACT
(CUSTOM_TYPE SENT BY ANY);
GO
CREATE PROCEDURE TESTING.PROCESS_QUEUE AS
BEGIN
DECLARE @HANDLE UNIQUEIDENTIFIER;
DECLARE @MESSAGE_TYPE SYSNAME;
DECLARE @MESSAGE INT;
WHILE (1 = 1)
BEGIN
BEGIN TRANSACTION;
WAITFOR (
RECEIVE TOP (1)
@HANDLE = CONVERSATION_HANDLE,
@MESSAGE_TYPE = MESSAGE_TYPE_NAME,
@MESSAGE = MESSAGE_BODY FROM TESTING.CUSTOM_QUEUE), TIMEOUT 1000;
IF (@@ROWCOUNT = 0)
BEGIN
COMMIT TRANSACTION;
BREAK;
END
INSERT INTO #DONE (ID) VALUES (@MESSAGE);
COMMIT TRANSACTION;
END
END
GO
CREATE QUEUE TESTING.CUSTOM_QUEUE
WITH STATUS = ON,
RETENTION = OFF,
ACTIVATION (
PROCEDURE_NAME = TESTING.PROCESS_QUEUE,
MAX_QUEUE_READERS = 5,
EXECUTE AS SELF
),
POISON_MESSAGE_HANDLING ( STATUS = OFF );
GO
CREATE SERVICE CUSTOM_TYPE_SERVICE
AUTHORIZATION XYZ_USER
ON QUEUE TESTING.CUSTOM_QUEUE
(POST_CUSTOM_TYPE_MESSAGE_CONTRACT);
GO
CREATE PROCEDURE TESTING.INSERT_INTO_QUEUE @ID INT AS
BEGIN
BEGIN TRANSACTION;
DECLARE @SERVICE SYSNAME;
SET @SERVICE = 'CUSTOM_TYPE_SERVICE';
DECLARE @CONTRACT SYSNAME;
SET @CONTRACT = 'POST_CUSTOM_TYPE_MESSAGE_CONTRACT';
DECLARE @HANDLE UNIQUEIDENTIFIER;
BEGIN
DIALOG CONVERSATION @HANDLE
FROM SERVICE @SERVICE
TO SERVICE @SERVICE
ON CONTRACT @CONTRACT
WITH ENCRYPTION = OFF;
SEND ON CONVERSATION @HANDLE MESSAGE TYPE CUSTOM_TYPE(@ID);
COMMIT TRANSACTION;
END
GO
EXEC TESTING.INSERT_INTO_QUEUE 1;
EXEC TESTING.INSERT_INTO_QUEUE 2;
EXEC TESTING.INSERT_INTO_QUEUE 3;
SELECT *
FROM TESTING.CUSTOM_QUEUE;
SELECT * FROM #DONE;
ROLLBACK TRANSACTION;
我在 中看到 3 條記錄TESTING.CUSTOM_QUEUE和 0 條記錄#DONE。
我在這里忽略了什么嗎?還是我需要缺少資料庫設定?我想知道使用自定義 SCHEMA(而不是 DBO)是否也會導致問題。有誰知道這里發生了什么?
uj5u.com熱心網友回復:
根據上面評論中的簡短對話關閉回圈,關鍵觀察是您正在插入佇列。該佇列的處理(在這種情況下是內部激活)本質上是異步的。如果您在將專案放入佇列后立即檢查佇列,則很可能這些專案尚未處理。但是,如果您等待一段時間,則處理佇列的任何內容都應該做它需要做的事情。
這是一篇很棒的文章,解釋了激活是如何發生的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/410542.html
標籤:
上一篇:SQLServer:無法獲取要輸出到varchar的列
下一篇:SQLServer中的磁區行專案
