【问题标题】:Service Broker only receiving one message at a timeService Broker 一次只接收一条消息
【发布时间】:2010-12-15 20:51:21
【问题描述】:

即使我指定 Receive Top(25) 等,我一次也只能收到一条消息出列。不确定我在存储过程中做错了什么?可能是一些微不足道的事情,但我没有看到问题。

存储过程:

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

知道我做错了什么吗?

谢谢,

B

【问题讨论】:

    标签: tsql sql-server-2008 service-broker


    【解决方案1】:

    我的猜测是每条消息都属于不同的对话(因此默认情况下属于不同的对话组)。如果是这种情况,那么这是预期的行为。

    来自Books Online - Receive (Transact-SQL)

    a 返回的所有消息 RECEIVE 语句属于同一个 对话组

    如果您想一次接收多条消息,请在单个会话中发送多条消息,或将group multiple conversations 发送到接收端的单个会话组中。

    【讨论】:

    • 谢谢 Pawel 我会看看那个。我没有看到那部分......这可能是正在发生的事情。
    • 你能提供任何例子吗?我们从表 INSERT 触发器发送消息,因此必须为每个 INSERT 创建单独的对话。我想批量接收所有可能的消息,但这不会发生,我看不到如何在单个组中移动对话(即使在 BEGIN DIALOG 中使用 WITH RELATED_CONVERSATION_GROUP)
    【解决方案2】:

    在运行 proc 之前,您知道该队列中有多少条消息吗?

    如果您运行以下查询以获取所有队列中的计数

    选择 sq.name, p.rows FROM sys.service_queues sq 加入 sys.internal_tables 它 ON sq.object_id = it.parent_id AND it.parent_minor_id = 0 和 it.internal_type = 201 在 i.object_id = it.object_id 和 i.index_id = 1 上加入 sys.indexes 作为 i 在 p.object_id = i.object_id 和 p.index_id = i.index_id 上加入 sys.partitions 作为 p 在哪里 sq.object_id = it.parent_id AND it.parent_minor_id = 0 AND it.internal_type = 201

    如果该队列中有超过 1 条消息,您的接收中应该会收到超过 1 条消息。

    【讨论】:

    • 队列中有不止一条消息
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多