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