2010-12-15 11 views
3

Receive Top(25)などを指定しても、一度に1つのメッセージをデキューするだけです。私のsprocの中で何が間違っているのか分かりませんか?たぶん些細なことかもしれませんが、私はこの問題を見ません。Service Brokerは一度に1つのメッセージしか受信しません

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 

私が間違っているの何任意のアイデア?

おかげで、

B

答えて

5

私の推測では、各メッセージは別の会話(したがって、デフォルトでは別の会話グループ)に属していると思います。これが当てはまる場合、これは予想される動作です。 Books Online - Receive (Transact-SQL)から

: によって返されるすべてのメッセージ文を受け取る

は、一度に複数のメッセージを受信したい場合は、上の複数のメッセージを送信する同じ 会話グループ

に属し単一の会話またはgroup multiple conversationsを受信側の単一の会話グループに追加します。

+0

ありがとうPawel私はそれを見ていきます。私はその部分を見ていない...おそらく起こっていることです。 – scarpacci

+0

これに例を挙げてください。 INSERTトリガーからメッセージを送信しているため、INSERTごとに別の会話を作成する必要があります。可能なすべてのメッセージをバッチで受信したいのですが、これは起こりません。また、(たとえBEGIN DIALOGでWITH RELATED_CONVERSATION_GROUPを使用しても)1つのグループで会話を移動する方法がわかりません。 – Mikhail

0

procが実行される前に、あなたがそのキューにあるメッセージの数を知っていますか?あなたは

SELECT sq.name、 p.rows sys.service_queuesからすべてのキューにカウントを取得するために次のクエリを実行する場合

平方 はそれが= sq.object_id ON sys.internal_tablesにそれに参加しましょう。 parent_id AND it.parent_minor_id = 0 AND it.internal_type = 201 i.object_id = it.object_idとi.index_id = 1のsys.indexesをiとして結合します。 p.object_id = iのpとしてsys.partitionsを結合します。 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

そのキューにメッセージが2つ以上ある場合は、1つ以上受信する必要があります。

+0

キューに複数のメッセージがあります – scarpacci

関連する問題