次の方法で共有


リアルタイム ワークフローの作成

非同期ワークフローと同様、リアルタイムワークフローは、現実のビジネス プロセスをモデル化および自動化するのに使用できます。 必要に応じてユーザー入力を求めることもでき、特定のイベント状況に応じて自動で開始したり、ユーザーが手動で開始したりすることもできます。 リアルタイム ワークフローはビジネス ユーザー向けで、たとえばアナリストの場合は、.NET Framework プログラミングの経験を必要とせず、同様の機能を同期プラグインに実装できるようになります。 Dynamics 365 Customer Engagement (on-premises) Web アプリケーションまたはコードでは、非同期またはリアルタイムにワークフローを作成できます。

リアルタイム ワークフローについてのいくつかの重要な点には、次の項目が含まれています。

  • 非同期ワークフローのような Workflow エンティティ レコードを使用して定義します。

  • 同期プラグインのように、イベント実行パイプラインのステージで実行します。リアルタイム ワークフローは、コア操作の前 (事前操作)、後(事後操作)、またはコア操作中に実行することができます。 コア操作の実行中に実行されるリアルタイム ワークフローは、ユーザー定義アクションの実装です。 リアルタイム ワークフローは、プラグインを処理するのと同様に、ステージ内でランク付けすることができます。詳細: イベント実行パイプライン

  • オンデマンドで実行されるか、イベントに応答して実行されるように構成すると、リアルタイム ワークフローは後で実行するようキューに置かれず、すぐに実行されます。

  • ワークフローのログオン ユーザーまたは所有者のセキュリティ コンテキストで実行できます。 ただし、オンデマンド実行に設定されているワークフローでは、ログオン ユーザーのセキュリティ コンテキストで必ず実行します。

  • 遅延または待機アクティビティは許可されません。

  • ログ記録が有効になっている場合にのみエラーを記録します。

  • 現在のトランザクション内で実行します。 非同期ワークフロー以外のワークフローおよび子ワークフローのすべての活動は、一つのトランザクションの一部です。 非同期子ワークフローは、別のトランザクション内のキューに置かれ、実行されます。

  • 非同期ワークフローを変換し、リアルタイムに戻すことができます。

必要なセキュリティ特権

ワークフローを実行できるように、リアルタイムプロセスのアクティブ化(prvActivateSynchronousWorkflow)というセキュリティ特権が、リアルタイムにワークフローをアクティブ化するのに必要となります。 ワークフロージョブの実行(prvWorkflowExecution)権限が、ワークフローの開始に必要です。 リアルタイムワークフローはコア システム操作に影響を与えるので、少数の経験のあるユーザーのグループだけにアクティブ化の特権を付与することをお勧めします。

コードでリアルタイムでワークフローを作成する

 

Dynamics 365 for Customer Engagement はリアルタイム ワークフローをサポートしますが、Web アプリケーションで対話的に作成する必要があります。 このセクションで説明した XAML ベースのワークフローは、設置型または IFD サーバーでのみサポートされます。

Workflow エンティティ レコードを作成することで、コードでリアルタイムにワークフローを作成できます。 メタデータ ブラウザー ツールを使用して Workflow エンティティの属性メタデータを確認します。 組織のエンティティ メタデータを表示するには、メタデータ ブラウザー ソリューションをインストールしてください。メタデータ ブラウザー ソリューションについては、「組織のメタデータの参照」を参照してください。 「エンティティ参照」でエンティティの参照ドキュメントを参照することもできます。

次の例では、非同期ワークフローを作成するコードを、リアルタイムワークフローを作成するコードと比較します。



// Create an asynchronous workflow.
// The workflow should execute after a new opportunity is created.
Workflow workflow = new Workflow()
{
    // These properties map to the New Process form settings in the web application.
    Name = "Set closeprobability on opportunity create (async)",
    Type = new OptionSetValue((int)WorkflowType.Definition),
    Category = new OptionSetValue((int)WorkflowCategory.Workflow),
    PrimaryEntity = Opportunity.EntityLogicalName,
    Mode = new OptionSetValue((int)WorkflowMode.Background),

    // Additional settings from the second New Process form.
    Description = @"When an opportunity is created, this workflow" +
        " sets the closeprobability field of the opportunity record to 40%.",
    OnDemand = false,
    Subprocess = false,
    Scope = new OptionSetValue((int)WorkflowScope.User),
    TriggerOnCreate = true,
    AsyncAutoDelete = true,
    Xaml = xamlWF,

    // Other properties not in the web forms.
    LanguageCode = 1033,  // U.S. English                        
};
_workflowId = _serviceProxy.Create(workflow);



// Create a real-time workflow. 
// The workflow should execute after a new opportunity is created
// and run in the context of the logged on user.
Workflow workflow = new Workflow()
{
    // These properties map to the New Process form settings in the web application.
    Name = "Set closeprobability on opportunity create (real-time)",
    Type = new OptionSetValue((int)WorkflowType.Definition),       
    Category = new OptionSetValue((int)WorkflowCategory.Workflow),
    PrimaryEntity = Opportunity.EntityLogicalName,
    Mode = new OptionSetValue((int)WorkflowMode.Realtime),

    // Additional settings from the second New Process form.
    Description = @"When an opportunity is created, this workflow" +
        " sets the closeprobability field of the opportunity record to 40%.",
    OnDemand = false,
    Subprocess = false,
    Scope = new OptionSetValue((int)WorkflowScope.User),
    RunAs = new OptionSetValue((int)workflow_runas.CallingUser),
    SyncWorkflowLogOnFailure = true,
    TriggerOnCreate = true,
    CreateStage = new OptionSetValue((int)workflow_stage.Postoperation),
    Xaml = xamlWF,

    // Other properties not in the web forms.
    LanguageCode = 1033,  // U.S. English
};
_workflowId = _serviceProxy.Create(workflow);

リアルタイムワークフローには、非同期ワークフローには含まれていない追加プロパティ セットがあります:

ワークフローの属性 説明
Category WorkflowCategory.Workflowに設定します。
RunAs ワークフローの所有者(workflow_runas.Owner)またはログオンユーザー(workflow_runas.CallingUser)のセキュリティ コンテキストで、ワークフローを実行するよう指定できます。
SyncWorkflowLogOnError trueの場合、エラーがProcessSession レコードに記録されます。 非同期ワークフローとは違い、リアルタイム ワークフロー実行は、System Jobレコードに記録されません。
CreateStageDeleteStage、または UpdateStage ワークフローを実行している、イベント実行パイプラインのステージを識別します: コア操作の前(workflow_stage.Preoperation)、または後(workflow_stage.Postoperation)。 ステージを目的の操作のトリガー イベントと一致させる必要があります。 たとえば、TriggerOnUpdatetrueの場合は、UpdateStageを設定する必要があります。

リアルタイムワークフローは取得の際に実行できます。 取得のほかに、サポートされている Web サービスメッセージの残りが、これらの3件のサポートされているイベントの 1 つにマッピングされます。 たとえば、状態操作の割当てまたは設定は、最終的には更新と同じです。
Mode つまり、実行モードです。 これは、WorkflowMode.Realtime へ設定されます。
Rank プラグイン実行やランク設定によるステージ内リアルタイム ワークフローの順番を設定できます。 1 のランクのプラグインまたはワークフローは、2 のランクの前に実行されます。
Xaml リアルタイム ワークフローを定義する XAML コードに設定します。

リアルタイム ワークフローを作成するための完全なサンプル コードは、サンプル: コードでリアルタイムでワークフローを作成する のトピックにあります。

非同期ワークフローをリアルタイムまたは操作後に変換する

非同期ワークフローが待機または遅延アクティビティを含んでいない限り、ワークフローの書き直しを必要とせずにUpdateRequest を使用して、ワークフローを非同期からリアルタイムおよび操作後へ変換します。 Web アプリケーションを使用して、対話的に変換を操作することもできます。 変換を実行する前は、ワークフローは下書きの状態(非アクティブ)である必要があります。

非同期ワークフローをリアルタイムに変換する

  1. ワークフローの UpdateRequest を作成します。

  2. ワークフローの Mode プロパティをWorkflowMode.Realtimeに設定します。

  3. 必要に応じて、CreateStageUpdateStage、または DeleteStage を設定します。 たとえば、ワークフローにTriggerOnDelete 設定があると、DeleteStage プロパティも設定されます。

  4. パラメーターとして更新要求を渡して Execute メソッドを呼び出します。

リアルタイムワークフローを非同期に変換する

  1. ワークフローの UpdateRequest を作成します。

  2. ワークフローの Mode プロパティをWorkflowMode.Backgroundに設定します。

  3. パラメーターとして更新要求を渡して Execute メソッドを呼び出します。

エラー処理とロールバック

データベース トランザクション中に実行され、例外をプラットフォームに返すワークフロー活動は、コア操作を取り消します。 すでに発生しているなら、これはコア操作のロールバックを発生させます。 また、イベント前とイベント後は、まだ実行されていないプラグインまたはリアルタイムワークフローを登録しました。 同じイベントによって起動された非同期ワークフローは実行されません。

停止ワークフロー ( TerminateWorkflow クラス) 活動をワークフローのキャンセルされたオプションに含める場合、カスタム ステータス メッセージ(Reason プロパティ) にビジネス プロセス エラー ダイアログでユーザーに表示される単一行のテキストを含むその活動に追加できます。

SyncWorkflowLogOnErrortrueに設定されている場合、リアルタイム ワークフロー エラーはProcessSession エンティティ レコードにログオンされます。

配布のリアルタイム ワークフローをパッケージする

Dynamics 365 Customer Engagement (on-premises) 組織にインポートできるようにワークフローを配布するには、Dynamics 365 Customer Engagement (on-premises) ソリューションにワークフローを追加します。 これは、Web アプリケーションを使用して設定 > カスタマイズ > ソリューションと移動すれば、容易に行えます。 ソリューションを作成するコードを記述できます。 ソリューションの使用に関する詳細については、拡張機能のパッケージ化および配布 を参照してください。

関連項目

ビジネス プロセスを自動化するワークフローの記述
独自のアクションの作成
イベント実行パイプライン
ビジネス プロセスを拡張するプラグインの記述