0

SSBSキューがあり、メインプロセスMがキューにメッセージを送信します。Nメッセージを1つずつフェッチして処理するサブプロセスがあります。すべてのメッセージが処理された後、サブプロセスは終了します。今、私は次のことをしています、

アプローチ1:

メインプロセスは、メッセージを送信Nした後に「EndOfData」を送信しMます。ただし、一部のサブプロセスは複数の「EndOfData」メッセージを受信する可能性があるため、うまく機能しません。そのため、一部のサブプロセスはメッセージを受信しません。

アプローチ2:(アプローチ1を拡張する)

各サブプロセスにIDを割り当て、「EndOfData」メッセージにもIDを埋め込みます。メッセージ内のIDがそのIDと一致しない場合、サブプロセスはロールバックします。ただし、ロールバックが多すぎてキューが無効になるため、「poisemessage」の問題が発生します。

begin tran
begin try
    WAITFOR(
        RECEIVE TOP(1)
            @MessageType = message_type_name,
            @MessageBody = CAST(message_body AS xml)
        FROM
            TargetQueue
    ) , TIMEOUT 1000
    if @MessageType = 'EndOfData' and 
       @MessageBody.value('(//ID/text())[1]', 'int') <> @ID
    BEGIN 
        rollback tran
        waitfor delay '00:00:02'
    END 

それを実装する良い方法はありますか?

更新:
サブプロセスは次の手順を実行します。

  1. 1つのメッセージを受信する
  2. 「仕事」の場合、
    1. メッセージを処理します(数分かかる場合があります)
    2. 「情報」メッセージをキューに送信して、メッセージが処理されたことをメインプロセスに通知します
  3. 「EndOfData」の場合、
    1. メインプロセスに「Exit」というメッセージを送信します
    2. https://..../EndDialog「存在する」メッセージを受信して​​終了します
  4. 2.2で送信されたメッセージの場合https://.../EndDialogは、それを受信するだけです
4

2 に答える 2

1

仮定すると、もう1つのアプローチN = 3

  1. を含む「EndOfData」タイプのメッセージを送信します3
  2. 3 つのサブプロセスの 1 つがこのメッセージを受信し、 を含む応答メッセージを送信し2、終了します。したがって、2 つの実行中のサブプロセスが残っています。
  3. で応答を受信し2、 を含む「EndOfData」タイプのメッセージを送信します2
  4. 2 つのサブプロセスの 1 つがこのメッセージを受信し、 を含む応答メッセージを送信し1、終了します。したがって、1 つの実行中のサブプロセスが残っています。
  5. で応答を受信し1、 を含む「EndOfData」タイプのメッセージを送信します1
  6. 最後に実行中のサブプロセスがこのメッセージを受け取り、 を含む応答メッセージを送信し0、終了します。実行中のサブプロセスは残っていません。
  7. 応答を受け取り0、「EndOfData」タイプのメッセージの送信を停止します。
于 2013-01-04T20:59:38.463 に答える
0

次のコードを使用して、作業をトランザクションに入れます。そのため、スクリプト ブロックはEndOfDataメッセージの受信後に終了できます。

$conn = new-object Microsoft.SqlServer.Management.Common.ServerConnection
$conn.DatabaseName = "..."
$conn.BeginTransaction()
$conn.ExecuteNonQuery("Receive message;")
# do work
$conn.CommitTransaction()

http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.common.serverconnection.committransaction.aspx

于 2013-01-19T02:53:19.123 に答える