2010-12-15 82 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