2016-12-29 19 views
2

私のAPIでリクエストを受け取ったとき、私は一連のステップを実行したい、それぞれのステップは豊富である。各ステップは成功するか失敗するかのいずれかです。成功すると、次のステップを実行する必要があります。失敗すると、終了ステップが実行され、フローが完了します。そのために、私はSpring State Machineをこの法案に合うように思っています。スプリングステートマシン - 作成する必要がありますか?

私は、ドキュメントをよく読んで、それで遊んが、いくつかのものは私を逃れるいます

  1. が要求とステートマシンの間で1対1の関係がなければならないことを意味し、リクエストごとに新しいState Machineインスタンスを作成しますか?あるいは、私はどういうわけか、次の要求のためにマシンをリセットして、完成したステートマシンを再利用すべきですか?

  2. 完成したステートマシンのクリーンアップはどうですか?ステートマシンのインスタンスを破棄してクリーンアップする方法はありません。要求ごとに1を作成すると、フレームワークが何らかの形でリソースを処理しない限り、効果的にメモリリークが発生しました。

+0

私はSpringの実装に精通していませんが、ドキュメンテーションを見ると、各マシンの状態が内部的に表現されていることがわかります(状態はマシンの外部に格納されています; ala 'State currentState = machine.start () ')。これにより、複数の要求にわたって単一のマシンを使用することができなくなります。これは、最初の要求が完了する前に2回目の要求が発生する可能性があります。それで、 –

+0

状態マシンが必要ですか?前提条件が満たされていることだけを確認している場合。単純な 'if(!firstSuccess)returnが失敗します。 if(!secondSuccess)return failure; '十分ではない? –

+0

私はこの流れをサポートするいくつかのデザインがあると思います。それらのうちの1つはSSMです。それを試してみるために、私はそれを選びました。 私は、リクエストとステートマシンインスタンスの間に1対1が必要であることに同意します。しかし、それは資源管理の問題を残す。インスタンスをリサイクルする必要がありますか?またはそれらを捨てるべきか?もしそうなら、どうですか? –

答えて

2

ご質問には正解ではありませんので、ここにコメントしてください。ステートマシンはコンセプトとして非常に緩やかなので、さまざまな方法で作業を行うことができます。

  1. ステップが次々とステップtasksのレシピがどのように実装されたかに関する全体的なコンセプト。これはタスクのダグを実行し、親タスクが失敗した場合にマシンがエラー状態に入り、ユーザーに物事を修正し、マシンに継続を要求する機会を与えます。 statemachine-recipes-tasksstatemachine-examples-tasks。この種のユースケースは、かなり一般的な新しいレシピを作成するのに適した候補になるでしょう。
  2. フレームワークは、マシンが停止した後に物事をクリアし、最終的にjvmはゴミをクリアする必要があります。異常なものが見つかった場合は、gh問題を提出してください。問題を修正します。
  3. 私はサンプルをstatemachine-examples-eventserviceで再利用していますが、私が行った作業はダンプSPR-15042であると頭のシェフから聞いたので、現在サンプルを再実装しています。マシンはsessionのスコープで使用することはできません。リッチオブジェクト(ssm)がシリアル化されていると、マシンが南になります。
  4. ステップフローを実行する状態と選択肢の組み合わせを実行するのは比較的簡単です。
  5. 私がステートチャートで提示した何らかのエラー処理については、gh-240にも何か考慮する必要があります。
  6. ssmがより汎用的なフローエンジンとして機能することができるのではないかと疑問がありましたが、まったく新しいプロジェクトとなることはないでしょう。フローの大半は別個のレシピとして扱うことができると考えられていました。
関連する問題