2010-11-23 15 views
2

会話が閉じられず、CONVERSING状態に留まっていることに気付いています。奇妙なことに、キューは一度に1つのメッセージだけを処理するように設定されています。しかし、実際には、CONVERSING状態では2つの会話があり、実際には何らかの作業をしており、もう1つは固まっているようです。Service Brokerの会話が閉じられていない(CONVERSING状態に留まっている)

私が使用している1つのキューとサービスは、通常のサービスブローカーの実装とは異なります(ダイアログの代わりに独白のようになります)。私はと活性化SP始めている:

RECEIVE TOP(1) 
    @Handle = conversation_handle, 
    @MsgTypeName = message_type_name 
FROM [//MyQueue] 

IF (@@ROWCOUNT = 0) 
    RETURN 
ELSE IF ((@MsgTypeName is null) or (@Handle is null)) 
    RETURN 
ELSE IF (@MsgTypeName != '//MyRequest') 
    BEGIN 
     END CONVERSATION @Handle 
     RETURN 
    END 
+0

もっと多くのコードを提供しない限り(私はビジネスロジックについては言及していませんが、ブローカ関連の部分)、すべてのものを設定するために使用したDDLコマンドは、あなたを助けるのが難しいでしょう。 –

答えて

0

の使用 "をCLEANUPで終わる会話 '会話ハンドルを';"会話を終わらせるためのライトの方法ではありません。

サービスブローカーは、モノログの会話ではなく、ダイアログ用に設計されています。それはまた2つの会話がある理由であるはずです(サービスを送信するために他のサービスを受け取ります - サービスは異なるデータベース/インスタンスに存在することができます)

メッセージを送信するために使用され、 "終了ダイアログ"メッセージと終了ダイアログ、他の魔法使いはメッセージを受け取り、それらのいくつかの処理を行います+作業が完了したらダイアログを終了します。

2

を使用すると、CLEANUP WITH

のEND CONVERSATION '会話ハンドル' を試すことができます。

私は過去にサービスブローカーと協力してきました。私はあなたに私がサービスブローカー

http://www.mssqltips.com/tip.asp?tip=1197 http://blogs.msdn.com/b/sqlserverfaq/archive/2011/05/03/service-broker-concepts-and-のために参照するために使用されるいくつかのトラブルシューティングのリンクを提供しますtroubleshooting.aspx

ユーティリティをssbdiagnose - http://msdn.microsoft.com/en-us/library/bb934450.aspx

-1
ELSE IF (@MsgTypeName != '//MyRequest') 
    BEGIN 
     END CONVERSATION @Handle 
     RETURN 
    END 

ない良いアイデア。これを試してください:

IF @MsgTypeName = '//MyRequest' 
BEGIN 
    /* Do something here with the message */ 
END 
ESLE IF @MsgTypeName = N'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog' 
BEGIN 
    END CONVERSATION @Handle 
END 
ELSE IF @MsgTypeName = N'http://schemas.microsoft.com/SQL/ServiceBroker/Error' 
BEGIN 
    END CONVERSATION @Handle 
    /* do some error reporting here */ 
END 

イニシエータとターゲットの両方が、本当に終了する前に会話を終了する必要があることを思い出してください。ターゲットは、通常、最初のEND CONVERSATIONメッセージをイニシエータに送り返すものです。したがって、Initiator(上のコード)では、着信メッセージのタイプを検査し、それに応じて動作する必要があります。これがストアドプロシージャにラップされている場合は、実際の応答メッセージと終了メッセージの両方を受信します。