2010-12-15 79 views
3

即使當我指定接收頂端(25)等時,我一次只能收到一條消息。不知道我在我的sproc裏面做錯了什麼?可能有些微不足道,但我沒有看到問題。服務代理一次只接收一條消息

存儲過程:

CREATE PROCEDURE dbo.SPP_DEQUEUE_MESSAGE 

AS 

BEGIN 

DECLARE @receiveTable TABLE(
message_type  sysname, 
message_body  xml, 
message_dialog  uniqueidentifier); 

    BEGIN TRANSACTION; 

    WAITFOR 
     (RECEIVE TOP(25) 
      message_type_name, 
      message_body, 
      conversation_handle 
      FROM TargetQueue1DB 
      INTO @receiveTable 
     ), TIMEOUT 3000; 

    SELECT 
     * 
    From @receiveTable;  

    Delete from @receiveTable; 

COMMIT TRANSACTION; 

END --End Sproc 

任何想法,我做錯了什麼?

感謝,

回答

5

我的猜測是每條消息屬於不同的對話(因此默認情況下屬於不同的對話組)。如果是這種情況,那麼這是預期的行爲。

Books Online - Receive (Transact-SQL)

由一個 返回的所有信息接收語句屬於同一 會話組

如果你想同時接收多條消息,在發送多條消息單個會話或group multiple conversations合併到接收端的單個會話組中。

+0

感謝Pawel我會看一看。我沒有看到那部分......這可能是正在發生的事情。 – scarpacci 2010-12-16 15:47:53

+0

您能否提供這方面的例子?我們從表INSERT觸發器發送消息,因此必須爲每個INSERT創建一個單獨的對話。我希望批量接收所有可能的消息,但這並未發生,我也看不到如何在單個組中移動會話(即使在BEGIN DIALOG中使用WITH RELATED_CONVERSATION_GROUP) – Mikhail 2016-06-21 09:02:24

0

你知道有多少消息是在隊列中,在運行proc前面?

如果您運行下面的查詢,以獲得計數所有的隊列

SELECT sq.name, p.rows FROM sys.service_queues平方米 加入sys.internal_tables它ON sq.object_id =它。 parent_id AND it.parent_minor_id = 0 AND it.internal_type = 201 加入sys.indexes as i on i.object_id = it.object_id and i.index_id = 1 將sys.partitions加入p.object_id = i。 object_id和p.index_id = i.index_id WHERE sq.object_id = it.parent_id AND it.pa rent_minor_id = 0 AND it.internal_type = 201

如果該隊列中有超過1條消息,則應該在您的接收中獲得超過1條消息。

+0

隊列中有多條消息 – scarpacci 2010-12-16 15:47:31