Japan Dynamics CRM Team Blog

Microsoft Dynamics CRM technical information for partners and customers

Microsoft Dynamics CRM: ワークフロー作成のベストプラクティス

Microsoft Dynamics CRM: ワークフロー作成のベストプラクティス

  • Comments 0

みなさん、こんにちは。

開発に関して、先日 US Team のブログで公開されたばかりの面白い記事があったので、
今回はそれを翻訳したいと思います。ワークフローのベストプラクティスに関してです。

Microsoft Dynamics CRM のワークフローエンジンは、カスタムビジネスロジックを実装するのに、パワフルな機能を
提供しています。しかしながら、時としてワークフローの開発は、複雑な問題に繋がってしまったり、またデザインミスから、
運用コストが高くついたり、ユーザーを混乱させることもあります。この記事では、ワークフローを実装する際の、いくつかの
重要な検討事項に付いて、解説したいと思います。

 

1. 子ワークフローを利用した構成

ワークフローは、一般的にいくつかの小さなステップから構成されます。そのため、ワークフローを作成する際には、どの
部分を一般化して、子プロセスとして構成し、再利用できるかを考える必要があります。これらの小さな要素を独立させて
子ワークフローを作成することにより、複数の親ワークフローから呼び出すことが可能となります。

子ワークフローを分離する利点としては、改修の際の管理が、分離した子ワークフローのみで完結することにあります。
また将来作成するワークフローを、複数の子ワークフローを組み合わせて作成することができるため、構成が簡潔に
なります。

ここで重要な検討事項は、子ワークフローは、親ワークフローに関連して 非同期 で実行されるため、子ワークフローは、
シーケンシャル実行が必要なサブプロセスとしては、使えないということです。

2. ワークフローの持続ポイントを認識する Awareness of persistence points in workflow definitions.

実行時間が長いワークフローを作成した場合には、そのワークフローがどこで持続ポイントを作成するのか、またそれが
何を意味するかを、事前に考える必要があります。ワークフローが持続状態になる理由はいくつかあります。例えば、特定の
イベントの発生を待機しているかもしれません。非同期サービスが停止しているかもしれません。またはカスタムステップに
おいて、PersistOnClose 属性によって明示的に持続するように構成されているかもしれません。いずれの場合でも、ワーク
フローエンジンは、ワークフローのインスタンスをアンロードし、ユーザーが手動で再開するか、自動的にワークフローを再開
するイベントが発生するまで、ワークフローを持続させます。

ここで重要な検討事項は、以下の 2 点です。

1) どのポイントでワークフローが停止しているか: ワークフローは、持続ポイントとなる最後のステップで停止しています。
そのため、再開時には、たとえその後のステップが停止以前に実行されたとしても、持続ポイント以降のステップは全て
再実行されます。このことはロジックの中で、一度しか実行がされないことを保障したいステップがある場合には重要です。
ワークフローのインスタンスは、以下のステップ後自動的に持続ポイントを作成します。

レコードの作成、レコードの更新、レコードの割り当て、電子メールの送信、子ワークフローの開始、状態の変更

カスタムコントロールの場合は、[PersistOnClose] 属性を追加して、終了時に持続ポイントを作成できます。
(詳細は http://msdn.microsoft.com/ja-jp/library/system.workflow.componentmodel.persistoncloseattribute.aspx

※[補足] 持続とは?
ワークフローを持続するとは、どういう意味でしょう。ワークフローはメモリー内に展開され(インスタンス化)、実行されます。
よって、障害やアプリケーションの終了など、なんらかの理由でメモリーからワークフローのインスタンスが削除された場合、
そのワークフローの実行状況は失われてしまいます。短時間で実行が終了するワークフローの場合は、その危険が少なく、
実行時間が長くなるほど、危険性は増します。

そこで、Windows Workflow Foundation では、ワークフローの実行状況を SQL データベースやファイルに明示的に
記録することにより、メモリから削除された場合にも、後ほど特定のポイントからワークフローを再実行できます。これが
持続ポイントを作るということであり、ワークフローが持続するということです。

Microsoft Dynamics CRM のワークフローの場合 WWF を利用しているため、カスタムのステップを持続させるために、
PersistOnClose が必要になると言うわけです。具体的な実装は、以下の URL を参考にしてください。

Adding Metadata to the Custom Workflow Activity (2010年1月時点英語):
http://technet.microsoft.com/ja-jp/library/cc151141(en-us).aspx

※[補足 2] どのような状況で、ステップが再実行される?
例えば、ステップ 1 がレコードの作成、ステップ 2 がカスタムコントロール、ステップ 3 が状態の変更のワークフローを想定
します。仮に、ステップ 2 が完了した時点で、障害があったとします。この場合、カスタムコントロールが PersistOnClose
属性を実装していない場合、持続ポイントはステップ 1 完了時点となり、再開時にはステップ 2 が再度実行されます。

この場合、ステップ 2 で他システムにデータを作成するロジックがあった場合、他システム側で実行をブロックしない限り、
そのレコードは重複して作成されます。

2) いつワークフローが再開されるか: ワークフローが、いつまで経っても発生しないイベントや、数年後に発生するような
イベントをを待っているとしたらどうでしょう。当然データベースは容易に膨れ上がり、パフォーマンスに影響するでしょう。
よって、このような状況を最小限にとどめる工夫が必要となります。

例えば、営業案件が受注ステータスになるまで待機するワークフローがある場合、一生実行されないかもしれません。
代わりに営業案件がクローズされるまで待機するように変更して、クローズ時にステータスを判定する処理を行えば、
同じことが実現でき、かつワークフローもいつまでも待つことは減るでしょう。

3. カスタムコントロールは、最小単位にする

カスタムのワークフローコントロールは、ロジック全体を実装すべきではありません。変わりに、最小単位のステップとして
実装し、大きなワークフローで利用されることが望ましいです。理由としては、カスタムコントロールは、終了時にしか、持続
ポイントを作成することができず、途中で一時的に停止させたり、持続させることができないためです。

一般的に、全てのロジックを順番に記述したカスタムコントロールを持つより、親ワークフローから、カスタムコントロールを
順次呼び出すほうが良いでしょう。これは、子ワークフローを利用する構成と似ています。例えば、取引先企業を作成時に
ワークフローが、カスタムコントロール A, B 及び C を呼び出す場合、全てをひとつのカスタムコントロールとして実装する
より、個別のモジュールとして、ワークフローに追加する方が望ましいです。

どのような単位に分離できるか検討して、実装してください。

4. 実行時間を正しく使う

CRM のワークフローエンジンは、「もし ワークフロー-実行時間 > [日: 10 後 取引先企業作成日] の場合には」のような、
実行時間の属性をもっています。この属性は 「ワークフローが公開された日」でも、「ワークフローが実行された時間」 でも
なく、実際にこの式を評価した時点の時刻となります。そのため、「[日: 1 後 ワークフロー-実行時間] まで待機し」の様な
条件を設定するとずっと満たされず、結果、ワークフローが毎日待機と再開を繰り返し、パフォーマンスに悪影響が出ます。

もしワークフローを特定の時間待機させたい場合には、以下の待機条件を使用してください。
「ワークフロー - タイムアウト - が次の値と等しい - (時間)」

この条件を使用すれば、ワークフローは特定の時間待機した後再開されます。

5. Plug-in Vs. ワークフロー

Plug-in とワークフローのどちらを使用すべきかは、よくある質問です。特定の状況に合わせて、どちらを使うべきかを計算
する方法はありませんが、以下の記事に一般的なガイドラインが紹介されていますので参考にしてください。(英語)

http://blogs.msdn.com/lezamax/archive/2008/04/02/plug-in-or-workflow.aspx

さて、以上で今回の記事は終わりですが、いかがだったでしょうか。ワークフローに関して知りたいことがあれば、
是非コメントしてくださいね!

元記事: Microsoft Dynamics CRM: Workflow Authoring Best Practices
http://blogs.msdn.com/crm/archive/2010/01/15/microsoft-dynamics-crm-workflow-authoring-best-practices.aspx

- Dynamics CRM サポート 中村 憲一郎

  • Loading...
Leave a Comment
  • Please add 3 and 4 and type the answer here:
  • Post