3

非同期タスクを調整するツールとして SQL Server Service Broker を学習しています。MasterServiceと のデータを組み合わせた があるEmployeeInfoServiceとしPayrollInfoServiceます。リストを取得し、EmployeeIDsそれぞれを会話として両方のサービスに送信します。これら 2 つのサービスの最後には、一度に 2 つを処理するアクティベーション sproc がありますEmployeeIDs

いくつかの質問

  1. 各従業員の応答を my 内の一時テーブルに保存するにはどうすればよいMasterServiceですか?
  2. EmployeeIDsステップ 1 で作成した 2 つの一時テーブルからデータを生成できるように、2 つのサービスがすべての処理を完了したことを確認するにはどうすればよいでしょうか?

これまでの私のコードは次のとおりです。

-- Get a whole bunch of EmployeeIDs

DECLARE @EmployeeConversation   uniqueidentifier
DECLARE @PayrollConversation    uniqueidentifier

BEGIN DIALOG @EmployeeConversation
    FROM SERVICE    MasterService
    TO SERVICE      'EmployeeInfoService';

    SEND ON CONVERSATION @EmployeeConversation MESSAGE (EmployeeID1)
    SEND ON CONVERSATION @EmployeeConversation MESSAGE (EmployeeID2)
    SEND ON CONVERSATION @EmployeeConversation MESSAGE (Employee...);

BEGIN DIALOG @PayrollConversation
    FROM SERVICE    MasterService
    TO SERVICE      'PayrollInfoService'
    WITH RELATED_CONVERSATION_GROUP = @EmployeeConversation;

    SEND ON CONVERSATION @PayrollConversation MESSAGE (EmployeeID1)
    SEND ON CONVERSATION @PayrollConversation MESSAGE (EmployeeID2)
    SEND ON CONVERSATION @PayrollConversation MESSAGE (Employee...);

-- Now I need to wait till both conversations are done.
-- How do I handle that?
4

1 に答える 1

3

両方の会話が完了するまで待つ必要があります。

いいえ、ありません。これは、メッセージ指向プログラミングにとって最も重要な部分です。応答を待つことはありません。応答は 1 秒で返される場合もあれば、1 週間で返される場合もあります。あなたがすることは、処理を終了することです。これで完了です。応答がサービスから来ると、アクティブになり、応答を処理します。

したがって、あなたの場合、プロシージャをMasterServiceキューに関連付けます。

create procedure usp_masterService
as
begin transaction
receive message_body, messge_type from MasterServiceQueue;
if message_type = 'EmployeeInfoMessage' then
   insert or update into stateTable info from message body;
if message_type = 'PayrollInfoMessgae' then
   insert or update into stateTable info from message body;
if allResponsesReceived
   do something
...
commit

alter queue MasterServiceQueue with activation (procedure usp_masterService);

従業員情報要求に関連付けられた状態をどのように処理し、「受信したすべての応答」を検出する方法は完全にビジネス ロジックです。ただし、一時テーブルを使用することはできません。応答は、さまざまなスレッド (アクティブ化された proc) 上のさまざまなトランザクションによって処理されます。最も重要なのは、サーバーの再起動後に処理される可能性があることです。

「PayrollInfoService」がリモート (別のマシン上) にあり、現在 6 時間のメンテナンスが行われている場合、フローは適切に処理する必要があります。返信は届きますが、6 時間かかります。アプリケーション UI でこれをどのように公開するかは、場合によって異なります。しかし、接続されていない疎結合の非対話型サービスを考えてみてください。

于 2013-11-09T09:19:34.277 に答える