2

ワークフロー システムを実装する必要があります。

たとえば、一部のデータをエクスポートするには、次のことを行う必要があります。

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

新しい Step オブジェクトの追加と実行を担当する Workflow という 2 種類のクラスの作成を開始しました。

各 Step は StepInterface を実装します。

私の主な関心事は、すべてのステップが前のステップに依存していることです (最初のステップを除く)。このような問題を処理する最善の方法は何だろうと考えています。

私は各ステップをループし、各ステップに前の結果 (ある場合) を提供することを考えましたが、私はそれで本当に満足していません。

別のアイデアは、次のように、「前の」ステップをステップに設定できるようにすることでした。

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

しかし、私は Workflow クラスの有用性を失います。

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

ところで、ワークフロー全体の成否も気になります。つまり、いずれかのステップが失敗した場合は、前のデータをロールバックまたはクリーンアップする必要があります。

4

3 に答える 3

4

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

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

大規模なサービス/サーバーとして実装することを計画している場合は、次のことも考慮する必要があります。

  1. ステップは、動的にロードされたライブラリーにある可能性があります
  2. XML/JSON ファイルのワークフロー定義 - ここでも、編集時に動的にリロードされます。
  3. リモート呼び出しとコールバック - コールバック API を使用してジョブをリモート サービスに送信します。リモート サービスがコールバックすると、フローの後続のステップでワークフローの実行が取得されます。
  4. 可能な場合は並列実行など
  5. ステートレスな設計
于 2012-04-05T19:25:00.533 に答える
1

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

主な質問に関しては、どれだけ洗練されたいかによって異なります。基本的なレベルでStepResultは、各ステップによって返され、次のステップに渡されるインターフェイスを定義できます。このアプローチの明らかな問題は、各ステップで のどの実装がStepResult期待されるかを「認識」する必要があることです。小規模なシステムの場合、これは許容される場合があります。大規模なシステムの場合、前のステップの結果を次のステップの入力に変換する方法を伝えることができる、何らかの構成可能なマッピング フレームワークが必要になるでしょう。そのため、Workflowを呼び出しStep、 をStep返しStepResultWorkflow次にStepResultConverter(構成可能なマッピングのもの)を呼び出し、 a をStepResultConverter返し、StepInput次にWorkflowwith を呼び出しStepますStepInput

于 2012-04-05T18:00:38.903 に答える