3

一部の会話が終了せず、CONVERSING 状態のままになっていることに気付きました。奇妙なことに、キューは一度に 1 つのメッセージのみを処理するように構成されています。ただし、実際には、CONVERSING 状態の会話が 2 つあります。

私が使用しているものの 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
4

3 に答える 3

1

「END CONVERSATION 'conversation handle' WITH CLEANUP;」の使用 会話を終了するためのライトな方法ではありません。

Service Broker は、モノログの会話ではなく、ダイアログ用に設計されています。これが、2 つの会話がある理由でもあるはずです (1 つはサービスの送信用、もう 1 つはサービスの受信用です。サービスは異なるデータベース/インスタンスに存在する可能性があるため)。

メッセージの送信に使用され、「ダイアログの終了」メッセージを受信して​​ダイアログを終了する送信サービスを作成できます。もう1つは、メッセージを受信して​​何らかの処理を行い、作業が完了したらダイアログを終了します。

于 2012-01-23T14:55:56.317 に答える
1

試してみませんか

END CONVERSATION '会話ハンドル' WITH CLEANUP;

私は過去にサービスブローカーと仕事をしたことがあります。Service Broker について参照していたトラブルシューティングのリンクをいくつか提供します。

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

于 2011-08-13T05:58:13.987 に答える
0
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 メッセージをイニシエーターに送り返すものです。そのため、イニシエーター (上記のコード) は受信メッセージの種類を検査し、それに応じて動作する必要があります。これがストアド プロシージャにラップされている場合、実際の応答メッセージと END CONVERSATION メッセージの両方を次々に受け取ります。

于 2014-07-08T18:01:55.900 に答える