ステート マシン パターンを適用できるトランザクション コードをモジュールにリファクタリングすることを検討しています。最初に、次のクラスを作成しました。
public interface IExecutableState {
public void execute();
}
public class StateMachine {
// final:
private static final Logger LOGGER = Logger.getLogger(StateMachine.class);
// instance private:
private HashMap<String, State> validStates;
private State currentState;
// getters:
public HashMap<String, State> getValidStates() { return this.validStates; }
public State getCurrentState() { return this.currentState; }
// setters:
public void setValidStates(HashMap<String, State> validStates) {
// assign the stateMachine attribute to each State from this setter, so that Spring doesn't enter an infinite loop while constructing a Prototype scoped StateMachine.
for (State s : validStates.values()) {
// validate that the State is defined with implements IExecutableState
if (!(s instanceof IExecutableState)) {
LOGGER.error("State: " + s.toString() + " does not implement IExecutableState.");
throw new RuntimeException("State: " + s.toString() + " does not implement IExecutableState.");
}
LOGGER.trace("Setting stateMachine on State: " + s.toString() + " to: " + this.toString() + ".");
s.setStateMachine(this);
}
LOGGER.trace("Setting validStates: " + validStates.toString() + ".");
this.validStates = validStates;
}
public void setCurrentState(State currentState) {
if (!(currentState instanceof IExecutableState)) {
LOGGER.error("State: " + currentState.toString() + " does not implement IExecutableState.");
throw new RuntimeException("State: " + currentState.toString() + " does not implement IExecutableState.");
}
LOGGER.trace("Setting currentState to: " + currentState.toString() + ".");
this.currentState = currentState;
}
}
public class State {
private StateMachine stateMachine;
public StateMachine getStateMachine() { return this.stateMachine; }
public void setStateMacine(StateMachine stateMachine) { this.stateMachine = stateMachine; }
}
すべての状態は次のようになりますpublic class <StateName> extends State implements IExecutableState { ... }
。
次に、このモデルを使用して、プロトタイプ スコープの Spring Bean を作成して、stateMachine をインスタンス化し、それにすべての状態を割り当てたいと考えました。
しかし、Spring WebFlow で利用できるものをいくつか調べたところ、私が求めているステート マシンの動作を完璧にエミュレートする WebFlow が見られるようになりました。そして、XML から作成した各状態フローを視覚的に表現できるようにします。
私が見つけた唯一の問題は、WebFlowsがWebプロジェクト/ Webアプリケーション/ Webサイト(分類したいもの)を対象としていることです。spring webflow で取得するタグに非常に似たものを探してい<view-state>
ますが、spring-core、spring-integration、または spring-batch プロジェクトで実行されているアプリケーション用です。