2012-04-05 6 views
1

ワークフローシステムを実装する必要があります。ワークフローシステムをどのように実装しますか?

例えば、いくつかのデータをエクスポートするには、私がする必要がある:

  1. XMLファイルを変換するXSLTプロセッサを使用し
  2. 任意のデータ構造に変換するために、結果の変換を使用し
  3. 使用インクルード(ファイルまたはデータ)を生成し、アーカイブを生成する
  4. アーカイブを特定のフォルダに移動します。

新しいStepオブジェクトを追加して実行する2つのタイプのクラスWorkflowを作成しました。

各ステップはStepInterfaceを実装します。

私の主な懸念事項はすべて私のステップが前のものに依存していることです(最初のものを除いて)。そして、私はそのような問題を処理する最良の方法が何であるか疑問に思っています。

私は各ステップをループし、それぞれのステップに前の(もしあれば)結果を提供しますが、実際にはそれに満足していません。

もう一つのアイデアは、「前」のステップは以下のように、ステップに設定することができるようにされているでしょう:

$s = new Step(); 
$s->setPreviousStep(Step $step); 

しかし、私はワークフロークラスの有用性を失います。

アイデア、アドバイスはありますか?

ところで、ワークフロー全体の成功または失敗についても心配しています。これは、いずれかの手順が失敗した場合、前のデータをロールバックまたはクリーンアップする必要があることを意味します。

答えて

1

それぞれのStepは、いずれかのステップが失敗した場合にワークフローが呼び出すことができる(好ましくは逆の順序で)rollback()メソッドを実装するため、この構造に簡単に収めることができます。

主な質問は、どの程度洗練されたものにしたいのですか。基本的なレベルでは、StepResultインターフェイスを定義できます。インターフェイスは各ステップで返され、次のインターフェイスに渡されます。このアプローチの明らかな問題は、各ステップがStepResultのどの実装を期待するかを「知る」べきであるということです。小さなシステムの場合はこれが受け入れられるかもしれませんが、大規模なシステムでは、前のステップの結果を次のステップの入力に変換する方法を説明できる設定可能なマッピングフレームワークが必要になるでしょう。だから、Workflowは、そのように上StepInputで次Stepを呼び出し、WorkflowStepInputを返しStepResultConverter、(自分の設定可能なマッピングのブツである)StepResultConverterを呼び出しStepStep戻りStepResultWorkflowを呼び出します。

+0

こんにちは、あなたの貴重な答えをありがとう、私は同じように(少なくとも最初のステップ、http://pastebin.com/KF2bp0Wy)私もStepResultのがStepInputではなく、 "設定"に関する私はSymfony2と一緒に作業していますが、結果を検証するためにConfigurationBuilderを使用するのは不思議でした。 – Trent

+0

私はあなたがJavaでそれをやっていない限り、あなたに実装の助けを与えることはできません。 :)ロールバックを行うための "自然な"方法は逆の順序で呼び出すことです。各ステップでは、実行後の状態とまったく同じ状態になっていることがわかります。 – biziclop

3

私は去年同様のワークフローエンジンを実装しましたが(閉鎖ソースなので共有できるコードはありません)その経験に基づいたいくつかのアイデアがあります:

  1. StepInterface - あなたが今やっていることをやり遂げることができます。
  2. さらに、ロールバック機能を提供しますが、手順が失敗した場合にはそれを確認してから、さらに進んでください。抽象的なステップでこれを処理できます(テンプレートメソッド)
  3. StepResultに基づいて分岐を検討するとよいでしょう。stepResultオブジェクトと条件を取るStepMatcherを実行できるように、そのサブステップは条件付きはtrueを返します。
  4. ステップエラーが発生した場合、例外フローを処理するためにStepExceptionを実行することもできます。理想的には、これはワークフロー・レベル(ステップが失敗した場合にこれを行う)および/またはステップ・レベルで定義できるものです。
  5. 私は、ステップが次のステップで使用できる明確に定義された構造(StepResult)を返すというアプローチを採用しました。大規模なデータ(例えば、大きなファイルなど)がある場合、リソースへのURI /ロケータがStepResultに渡されます。
  6. あなたのワークフローがで動作するようにコンテキストを必要としている - あなたが引用例では、これには、ファイル名、アーカイブの場所となります - これはworkflowContext
  7. 考える 追加
思考

あなたは検討する必要がありますあまりにも以下 - これはあなたが大規模なサービス/サーバとして実装することを計画しているものがある場合:

    動的にロードされたライブラリであることができ
  1. ステップ
  2. ワークフローXML/JSONファイルの定義 - 編集時に動的に再ロードされます。
  3. リモート呼び出しとコールバックAPIを使用したリモートサービスへのコールバックジョブの送信。リモートサービスがコールバックすると、フローの次のステップでワークフローの実行が取得されます。
  4. 私はfinite state machineを使用してワークフローを実装する大成功を持っていたパラレル実行可能など
  5. ステートレスデザイン
1

。お互いにリンクしている複数のワークフローで、好きなだけシンプルに複雑にすることができます。一般に、FSMは、オブジェクト上の遷移のジャーナルを保持し、単に最後のエントリを検索することによって、所与のオブジェクトの現在の状態が履歴テーブル内で追跡される単純なテーブルとして実施することができる。だから、移行は次の形式になります。

nextState = TransLookup(currState、イベント、[条件])

あなたがフロントエンドを実装している場合は、使用可能なイベントのリストを構築するために、この遷移情報を使用することができます現在の状態のオブジェクトに追加します。

関連する問題