まず、対話は私が知る限り会話と同じです。同じものの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が提供しているすべての機能を使用することはほとんどありません。
あなたの答えをありがとう。 最後の問題(プロセスを開始し、すべてが完了した時点で最終的に回答を得るための答えを集める)に対するあなたの答えが、カウントよりもトラッキングテーブルを使用することになると理解しています。活性化された手順? –
そうだと思います。私の考案した例では、新しい従業員を雇うという論理的な操作に由来する3つの実際の操作があることを知っています。これらの実際の操作のそれぞれは、単純な「1つのメッセージを送信して応答を受信する」か、複雑な前後関係になる場合があります。モデリングしているインタラクションがどれほど単純か複雑かに基づいて、メッセージフローを柔軟に定義できます。 –
エラーが発生しました9610 ... \t FROM SERVICE句のサービス '<新しい会話の<イニシエータサービス>'は、%s = '%'によって参照されているサービス '<最初の会話のターゲットサービス>と一致する必要があります。 * ls '。 これは、会話グループが同じ契約に基づいてサービスを参照する必要があることを意味しますか? –