Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-Spring框架-状态机_Java_Spring_Business Process Management_State Machine - Fatal编程技术网

Java-Spring框架-状态机

Java-Spring框架-状态机,java,spring,business-process-management,state-machine,Java,Spring,Business Process Management,State Machine,我一直在考虑将一些应该是事务性的代码重构到模块中,在这些模块中我可以应用状态机模式。最初,我创建了以下类: public interface IExecutableState { public void execute(); } public class StateMachine { // final: private static final Logger LOGGER = Logger.getLogger(StateMachine.class); // i

我一直在考虑将一些应该是事务性的代码重构到模块中,在这些模块中我可以应用状态机模式。最初,我创建了以下类:

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; }
}
所有状态看起来都像:公共类扩展状态实现IExecutableState{…}

然后,使用这个模型,我想创建一个原型范围的Springbean来实例化stateMachine,并为其分配所有状态

然而,在查看了SpringWebflow中的一些可用内容之后,我开始看到WebFlow,它完美地模拟了我所寻求的状态机行为。并且,以一种允许我从XML创建的每个状态流的可视化表示的方式


我发现的唯一问题是,WebFlow是针对Web项目/Web应用程序/Web站点的,无论您想将它们分类为哪个。我正在寻找与spring webflow中的标记非常相似的东西,但适用于运行在spring core、spring integration或spring batch项目中的应用程序。

您可以看看

您是否有意保持状态集的可扩展性,或者它们是在编译时关闭的?@chrylis:如果你问我为什么在我的问题中提到的设计中使用scope=prototype,那是因为我希望在一个守护进程中有一个StateMachine对象的多个实例,每个线程可以运行一个StateMachine实例。其中,每个状态机将从其初始状态(某种类型的出列状态或waitUntilEventOccursState)开始,然后对生成的事务执行操作,对该事务的每个状态进行分配,并在完成时关闭它们。Spring WebFlows引入的概念反映了我想要的行为,并且有插件提供帮助,但这是针对WebFlow的。我提出这个问题的原因是,在编译时已知状态的状态机可以更干净、更容易、更高效地用枚举而不是映射来实现,而且它可以经常避免像状态机框架这样复杂的东西。@chrylis:我希望有一个像springwebflow或BPM流这样的可视化的东西;因为它帮助程序员分离代码模块的流行为,所以现在他们只需要关注代码的基本块实现。它使状态机的流程更易于遵循。我从一个从状态机的流程中注入新行为的角度来看待它,对于一个新的开发人员来说,管理是多么容易。