1

ステート マシン パターンを適用できるトランザクション コードをモジュールにリファクタリングすることを検討しています。最初に、次のクラスを作成しました。

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 プロジェクトで実行されているアプリケーション用です。

4

1 に答える 1

-1

Spring State Machineを見ることができます

于 2015-08-04T10:43:40.527 に答える