2010-12-15 2 views
3

Receive Top (25) 등을 지정하는 경우에도 한 번에 하나의 메시지 만 대기열에서 제외됩니다. 내 sproc 내부에서 내가 뭘 잘못하고 있는지 확실하지 않니? 아마 사소한 일이지만, 나는 그 문제를 보지 못한다.Service Broker는 한 번에 하나의 메시지 만 수신합니다.

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)에서

:

에 의해 반환되는 모든 메시지는 RECEIVE 문은 같은 대화 그룹에 속하는

당신이 한 번에 여러 메시지가 나타난다에서 여러 메시지를 보내려면 단일 대화 또는 group multiple conversations을 수신 측의 단일 대화 그룹에 추가 할 수 있습니다.

+0

고맙습니다. Pawel 저것 좀 살펴 보겠습니다. 나는 그 부분을 보지 못했습니다 ... 그것은 아마 일어나는 일입니다. – scarpacci

+0

이것에 대한 예제를 제공해 주시겠습니까? INSERT 트리거 테이블에서 메시지를 보내므로 모든 INSERT에 대해 별도의 대화를 만들어야합니다. 가능한 모든 메시지를 일괄 적으로 수신하고 싶습니다. 그러나 이러한 일은 발생하지 않으며 단일 그룹에서 대화를 이동하는 방법을 알지 못합니다 (BEGIN DIALOG에서 WITH RELATED_CONVERSATION_GROUP을 사용하는 경우조차도). – 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에서 sys.partitions를 p로 조인하십시오. 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을 초과해야합니다.

+0

대기열에 메시지가 두 개 이상 있습니다. – scarpacci

관련 문제