4

Statesの単純なステート マシンがEventsありTransitionsます。

州:WIP, SUBMITTED, REJECTED, APPROVED

イベント:SUBMIT, APPROVE, REJECT

トランジション:

@Override
public void configure(StateMachineTransitionConfigurer<States,Events> transitions) 
                          throws Exception {
    transitions
        .withExternal()
            .source(States.WIP)
            .target(States.SUBMIT)
            .event(Events.SUBMIT)
            .and()
        .withExternal()
            .source(States.SUBMITTED)
            .target(States.APPROVED)
            .event(Events.APPROVE)
            .and()
        .withExternal()
            .source(States.SUBMITTED)
            .target(States.REJECTED)
            .event(Events.REJECT);;
}
  1. SUBMIT イベントの SUBMITTED への WIP
  2. APPROVE イベントの APPROVED に SUBMITTED
  3. REJECT イベントの SUBMITTED から REJECTED

WIP以下のように初期状態として設定しました。

@Override
public void configure(StateMachineStateConfigurer<States, Events> states) 
            throws Exception {
    states
    .withStates()
        .initial(States.WORK_IN_PROGRESS)
        .states(EnumSet.allOf(States.class));
}

複数のユーザーがこのステート マシンと対話します。ソース状態とターゲット状態の組み合わせに対して同じイベントが複数回発生した場合、最初のイベントのみがステート マシンによって受け入れられ、後続のイベントは受け入れられません。

これはステート マシンからの有効な動作ですか? はいの場合、追加する必要がある追加の構成はありますか?

4

1 に答える 1

6

このようなシナリオで 1 つのステート マシン インスタンスを使用しても、エージェントと承認者の両方が正確に 1 セットのドキュメントを処理する場合にのみ機能します。承認者がマシンをドキュメントを送信できる状態に戻した場合にのみエージェントが新しいドキュメントを送信できるため、現実のユースケースでは当然問題が生じます。

したがって、提出されたドキュメントのセットごとに専用のインスタンスが必要になります。これは、構成http://docs.spring.io/spring-statemachine/docs/1.0.0.RELEASE/reference/htmlsingle/#sm-factoriesからファクトリーを公開するか、ビルダーhttp:// docs.spring.io/spring-statemachine/docs/1.0.0.RELEASE/reference/htmlsingle/#state-machine-via-builder . 次に、話しているマシンを手動で制御する必要があります。

ステート マシンを保持しているプロセスを再起動する必要がある場合、誰かが承認するのを待ってドキュメントが何日もそこに座っている可能性があると述べました。(単純なインプロセス ステート マシンでは状態が失われます)

この問題に取り組むには、少し異なるアプローチをお勧めします。「もの」がデータベースに保持さ、単一のステート マシン インスタンスは、ステート マシンを介してデータベースを更新するために使用されます。これにより、データを永続ストアに保持し、ステート マシン内で遷移ロジックを処理できます。

現在、これらの使用シナリオをより使いやすくするために、より優れた永続化モデルを実装し、スプリング セキュリティとスプリング セッションを介していくつかの魔法を導入して、ステート マシンで実行できるさまざまなロールを緩和/保護しようとしています。今後のリリースにご期待ください。

于 2015-10-27T15:01:27.703 に答える