domingo, 24 de julio de 2016

Spring Statemachine Framework


Nunca les paso que deben diseñar una maquina de estados, pero utilizar un framework de bpm es muchisimo pero hacerlo a mano es un trabajo muy arduo.

Por eso spring diseño, Spring Statemachine Framework.

La idea es simple, es un framework que permite diseñar maquinas de estados de forma muy fácil. Como cualquier maquina de estados tenemos estados y eventos que permiten cambiar de estado:

 static enum States {
    STATE1, STATE2
}

static enum Events {
    EVENT1, EVENT2
}

Con esto tenemos los estados y los eventos, pero falta algo muy importante, definir los caminos o transiciones para esto utilizamos un objeto de configuración:

@Configuration
@EnableStateMachine
static class Config1 extends EnumStateMachineConfigurerAdapter<States, Events> {

    @Override
    public void configure(StateMachineStateConfigurer<States, Events> states)
            throws Exception {
        states
            .withStates()
                .initial(States.STATE1)
                .states(EnumSet.allOf(States.class));
    }

    @Override
    public void configure(StateMachineTransitionConfigurer<States, Events> transitions)
            throws Exception {
        transitions
            .withExternal()
                .source(States.STATE1).target(States.STATE2)
                .event(Events.EVENT1)
                .and()
            .withExternal()
                .source(States.STATE2).target(States.STATE1)
                .event(Events.EVENT2);
    }
}

Luego definimos el bean que va ser utilizado en esta maquina de estado:

@WithStateMachine
static class MyBean {

    @OnTransition(target = "STATE1")
    void toState1() {
    }

    @OnTransition(target = "STATE2")
    void toState2() {
    }
}

Finalmente podemos utilizar esta maquina:

static class MyApp {

    @Autowired
    StateMachine<States, Events> stateMachine;

    void doSignals() {
        stateMachine.start();
        stateMachine.sendEvent(Events.EVENT1);
        stateMachine.sendEvent(Events.EVENT2);
    }
}

Y listo!

Dejo link: http://projects.spring.io/spring-statemachine/