<dependency> <groupId>com.github.stateless4j</groupId> <artifactId>stateless4j</artifactId> <version>2.6.0</version> </dependency>
はじめに
ステートマシンと軽量ステートマシンベースのワークフローをjavaコードで直接作成します。
StateMachineConfig<State, Trigger> phoneCallConfig = new StateMachineConfig<>();phoneCallConfig.configure(State.OffHook) .permit(Trigger.CallDialed, State.Ringing);phoneCallConfig.configure(State.Ringing) .permit(Trigger.HungUp, State.OffHook) .permit(Trigger.CallConnected, State.Connected);// this example uses Java 8 method references// a Java 7 example is provided in /examplesphoneCallConfig.configure(State.Connected) .onEntry(this::startCallTimer) .onExit(this::stopCallTimer) .permit(Trigger.LeftMessage, State.OffHook) .permit(Trigger.HungUp, State.OffHook) .permit(Trigger.PlacedOnHold, State.OnHold);// ...StateMachine<State, Trigger> phoneCall = new StateMachine<>(State.OffHook, phoneCallConfig);phoneCall.fire(Trigger.CallDialed);assertEquals(State.Ringing, phoneCall.getState());
stateless4jは、javaのステートレスのポートです
機能
ほとんどの標準ステートマシン構成がサポートされています:
- 任意のjava型(数値、文字列、列挙型など)の状態とトリガーの一般的なサポート。
- 階層状態
- 状態のエントリ/終了イベント
- 条件付き遷移をサポートするガード句
- 内部遷移を遷移するときにユーザー定義アクショ
onExit
/onEntry
) - イントロスペクション
いくつかの便利な拡張機能も提供されています:
- パラメータ化されたトリガー
- リエントラント状態
階層状態
以下の例では、OnHold
状態はConnected
状態のサブステートです。 これは、OnHold
コールがまだ接続されていることを意味します。
phoneCall.configure(State.OnHold) .substateOf(State.Connected) .permit(Trigger.TakenOffHold, State.Connected) .permit(Trigger.HungUp, State.OffHook) .permit(Trigger.PhoneHurledAgainstWall, State.PhoneDestroyed);
正確な現在の状態を報告するStateMachine.getState()
プロパティに加えて、isInState(State)
メソッドが提供されます。 上記の例がOnHold
状態の場合、isInState(State.Connected)
もtrue
と評価されるように、isInState(State)
はサブステートを考慮に入れます。
エントリ/終了イベント
この例では、呼び出しが接続されたときにstartCallTimer()
メソッドが実行されます。 通話が完了するとstopCallTimer()
が実行されます(電話を壁に掛けるか、壁に掛けるかのいずれかで実行されます。)
呼び出しは、Connected
状態とOnHold
状態の間を移動することができます。startCallTimer(
)メソッドとstopCallTimer()
メソッドは、OnHold
状態がConnected
状態のサブステートであるため、繰り返し呼び出されます。
エントリ/終了イベントハンドラーには、トリガー、ソース、および宛先の状態を記述するタイプTransition
のパラメーターを指定できます。
遷移時のアクション
遷移時にユーザー定義のアクションを実行することができます。’Normal’または’re-entrant’遷移の場合、このアクションはパラメータなしで呼び出されます。 “動的”遷移(トリガー指定のパラメータに基づいてターゲット状態を計算する人)の場合、thetriggerのパラメータがアクションに与えられます。
このアクションは、遷移が実際に実行された場合にのみ実行されるため、遷移がガードされ、ガードが遷移を禁止する場合、アクションは実行されません。
遷移が実行されると、現在の状態のonExit
ハンドラとtarget状態のonEntry
ハンドラの間でアクションが実行されます(re-entranttransitionの場合は同じ状態になる可能性があります。
ライセンス
Apache2.0ライセンス
@oxo42によって作成
Chris Narkiewicz@ezaquariiによって維持