2017-05-19 4 views
0

私は会話の正確な定義について疑問に思っています。MSのドキュメントとチュートリアルでは、これについてはあまり指摘していません。複数の会話および/またはキューについて

まず...ダイアログと会話には違いがありますか?

各会話を中心に展開してい

  • 同じメッセージまたは等価なメッセージ(CASE/SWITCHのシナリオと同様に活性化された手順により処理されているIEメッセージタイプ)のみを含むべきであるキューを仮定一意のキュー?

  • プロシージャAがメッセージを処理するプロシージャBをアクティブにするキューにメッセージを送信した後、応答を発行すると、プロシージャAはプロシージャCを使用する必要がありますか?同じ契約で2つのキューを作成する必要があると仮定するのは正しいですか?しかし、いくつのサービスがありますか?このシナリオでは、どのようにどこで終了会話を使用しますか?

  • プロシージャAが、メッセージを処理するプロシージャBをアクティブにするキューにメッセージを送信した後、別の/いくつかの他のプロシージャCのために別の/いくつかのメッセージを発行する場合、これらのキュー/サービス/同じ会話では?同じ会話グループですか? (私は私の会話が同じグループに属していることを確認するには、GET CONVERSATION GROUPの後に何をしますか?)DIALOGをBEGIN/BEGIN TRANSACTIONを発行するか、
    [{RELATED_CONVERSATION WITH

    を[使用している場合、同じ会話ハンドルを渡す意味するものではないこと= related_conversation_handle
    | RELATED_CONVERSATION_GROUP = related_conversation_group_id}]

?そして...最後は重要なことではありませんが、複数のメッセージを使用して、異なるパラメータでCへの呼び出しを並行/フォークしている場合、全く異なる会話/会話グループを開始したいと思うでしょうか、ユニークな「ナレーション」

  • を持っているああ...もう一つの事は...それらの一つ一つが、別のものを開始する前に完了するのを待ち、いくつかの治療法を呼び出すためにいくつかのメッセージを使用することをお勧めはありますか?各手順でメッセージを受信し、回答を送信し、回答によってアクティブ化されたプロシージャは、そのキュー内の前のメッセージをチェック/カウントし、それらがすべてそこにある場合にのみ続行する方法がありますか?会話ID(または会話グループID)をチェックして、それらのメッセージがすべて同じグループの回答によって発信されることを確認する必要がありますか?

    あまりにも混乱はありませんが、MSのチュートリアルは...うーん、少し単純です。

答えて

1

まず、対話は私が知る限り会話と同じです。同じものの2つの名前。

キューにはさまざまなメッセージタイプを含めることができます。メッセージを処理して(内部で起動されたストアドプロシージャであろうと外部アプリケーションであろうと)メッセージを処理してそのタイプを区別し、それに「正しいこと」を実行するのは、サービスは1つのキューしか持つことができませんが、キューは多くのサービスを持つことができます(実際にはそれを実際には見ていませんが)。サービスは、サービス契約を通じて受け入れ、生成できるメッセージタイプを定義します。

キュープロセッサーが同じ会話で応答するか、新しいキューページを開始するかについては、完全にあなた次第です。私はあなたが良い理由がないことを知っていない限り、同じ会話で返答することを提案します。同じ会話を使用する方法については、receiveステートメントを発行するときに会話ハンドルを取得できます。あなたの返信に続いてsendを発行するときにそれを会話処理として使用してください。

私が会話グループについて考える方法は、あなたは同じことに関して異なるサービスに話す必要があるかもしれません。ここには工夫した例があります:

私は新しい雇用プロセスを持っているとしましょう。

彼らは、同じイベントのために、すべての論理的だけれどもあなたの保険プロバイダに登録給与システムにエントリを作成し、ログイン

  • を作成します。これは、次の手順を持っています(すなわち、「私は新しい従業員を雇った」)。そのため、すべての会話を1つの会話グループにまとめて、個々の会話を別々に追跡することができます。このような何か:

    declare @handle uniqueidentifier, @group uniqueidentifier = NEWID(), 
    @message XML = '<employee name="Ben Thul" />'; 
    
    BEGIN TRAN 
        begin dialog @handle 
         from service [EmployeeService] 
         to service 'LoginService' 
         on contract [LoginContract] 
         with related_conversation_group = @group; 
    
        SEND ON CONVERSATION (@handle) 
         MESSAGE TYPE [NewLoginRequest] 
         (@message); 
    
        INSERT INTO [dbo].[OpenRequests] 
        (
         [GroupIdentifier], 
         [ConversationIdentifier], 
         [ServiceName], 
         [Status], 
         [date_modified] 
        ) 
        VALUES 
         (@group, @handle, 'LoginService', 'RequestSent', GETUTCDATE()); 
    
        BEGIN DIALOG @handle 
         FROM SERVICE [EmployeeService] 
         TO SERVICE 'PayrollService' 
         ON CONTRACT [PayrollContract] 
         WITH RELATED_CONVERSATION_GROUP = @group; 
    
        SEND ON CONVERSATION (@handle) 
         MESSAGE TYPE [NewPayrollRequest] 
         (@message); 
    
        INSERT INTO [dbo].[OpenRequests] 
        (
         [GroupIdentifier], 
         [ConversationIdentifier], 
         [ServiceName], 
         [Status], 
         [date_modified] 
        ) 
        VALUES 
         (@group, @handle, 'PayrollService', 'RequestSent', GETUTCDATE()); 
    
        BEGIN DIALOG @handle 
         FROM SERVICE [EmployeeService] 
         TO SERVICE 'InsuranceService' 
         ON CONTRACT [InsuranceContract] 
         WITH RELATED_CONVERSATION_GROUP = @group; 
    
        SEND ON CONVERSATION (@handle) 
         MESSAGE TYPE [NewInsuranceRequest] 
         (@message); 
    
        INSERT INTO [dbo].[OpenRequests] 
        (
         [GroupIdentifier], 
         [ConversationIdentifier], 
         [ServiceName], 
         [Status], 
         [date_modified] 
        ) 
        VALUES 
         (@group, @handle, 'InsuranceService', 'RequestSent', GETUTCDATE()); 
    COMMIT 
    

    は今、あなたはこれらの要求のそれぞれを別々同じ論理演算にそれらすべてを結びつける方法を追跡する方法があります。各サービスがメッセージを処理すると、成功、失敗、または「私には別のメッセージが必要です」というメッセージが返されます。その時点で、OpenRequestsテーブルを現在のステータスで更新できます。

    サービスブローカーは圧倒的な可能性があります。あなたのための私のアドバイスは、メッセージがどこから渡される必要があるかについて考えることです。ここでは、サービス、メッセージタイプ、契約などの設計を開始します。 SBが提供しているすべての機能を使用することはほとんどありません。

  • +0

    あなたの答えをありがとう。 最後の問題(プロセスを開始し、すべてが完了した時点で最終的に回答を得るための答えを集める)に対するあなたの答えが、カウントよりもトラッキングテーブルを使用することになると理解しています。活性化された手順? –

    +0

    そうだと思います。私の考案した例では、新しい従業員を雇うという論理的な操作に由来する3つの実際の操作があることを知っています。これらの実際の操作のそれぞれは、単純な「1つのメッセージを送信して応答を受信する」か、複雑な前後関係になる場合があります。モデリングしているインタラクションがどれほど単純か複雑かに基づいて、メッセージフローを柔軟に定義できます。 –

    +0

    エラーが発生しました9610 ... \t FROM SERVICE句のサービス '<新しい会話の<イニシエータサービス>'は、%s = '%'によって参照されているサービス '<最初の会話のターゲットサービス>と一致する必要があります。 * ls '。 これは、会話グループが同じ契約に基づいてサービスを参照する必要があることを意味しますか? –

    関連する問題