stateless4j/stateless4j

 <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によって維持

コメントを残す

メールアドレスが公開されることはありません。