Maîtriser Spring Statemachine 2.2.0 pour la gestion d'états complexes

Introduction à Spring Statemachine 2.2.0

Spring Statemachine 2.2.0 est un framework officiel conçu par l'équipe Spring pour faciliter l'implémentation de machines à états dans les applications Spring. Cette solution permet aux développeurs de gérer efficacement des logiques d'état complexes tout en s'intégrant harmonieusement avec l'écosystème Spring.

Fonctionnalités principales

La version 2.2.0 offre un ensemble complet de fonctionnalités :

  • Hiérarchie d'états : Prise en charge des sous-états et structures hiérarchiques pour gérer des configurations complexes
  • Machines à états parallèles : Support des flux parallèles, fourches et jointures pour les scénarios concurrents
  • Mécanisme piloté par événements : Transitions déclenchées par des événements avec support des déclencheurs, gardes et actions
  • Configuration typée : Adaptateurs sécurisés pour réduire les erreurs de configuration
  • Intégration Spring : Compatibilité avec Spring Boot, Spring MVC et autres modules du framework

Cas d'utilisation typiques

Ce framework s'applique particulièrement bien aux scénarios suivants :

  • Gestion des commandes : États de commande e-commerce (création, paiement, expédition, livraison)
  • Moteurs de workflow : Gestion des processus métiers complexes (approbations, planification de tâches)
  • Contrôle d'équipements : États des dispositifs IoT (démarrage, fonctionnement, arrêt)

Démarrage rapide

Ajout des dépendances

Intégrez Spring Statemachine dans votre projet Maven :

<dependency>
    <groupId>org.springframework.statemachine</groupId>
    <artifactId>spring-statemachine-core</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>

Définition des énumérations

Créez vos énumérations d'états et d'événements :

public enum EtatsCommande {
    EN_ATTENTE, PAYEE, EXPEDIEE, LIVREE
}

public enum EvenementsCommande {
    PAIEMENT_EFFECTUE, COLIS_EXPEDIE, COMMANDE_LIVREE
}

Configuration de la machine

Configurez votre machine à états via une classe de configuration :

@Configuration
@EnableStateMachine
public class ConfigurationMachineEtats extends EnumStateMachineConfigurerAdapter<EtatsCommande, EvenementsCommande> {
    
    @Override
    public void configure(StateMachineStateConfigurer<EtatsCommande, EvenementsCommande> configEtats) throws Exception {
        configEtats
            .withStates()
            .initial(EtatsCommande.EN_ATTENTE)
            .states(java.util.EnumSet.allOf(EtatsCommande.class));
    }

    @Override
    public void configure(StateMachineTransitionConfigurer<EtatsCommande, EvenementsCommande> configTransitions) throws Exception {
        configTransitions
            .withExternal()
            .source(EtatsCommande.EN_ATTENTE).target(EtatsCommande.PAYEE)
            .event(EvenementsCommande.PAIEMENT_EFFECTUE)
            .and()
            .withExternal()
            .source(EtatsCommande.PAYEE).target(EtatsCommande.EXPEDIEE)
            .event(EvenementsCommande.COLIS_EXPEDIE);
    }
}

Utilisation dans les services

Injectez et utilisez la machine dans vos services métier :

@Service
public class ServiceGestionCommande {
    
    @Autowired
    private StateMachine<EtatsCommande, EvenementsCommande> machineEtats;

    public void traiterEvenement(EvenementsCommande evenement) {
        machineEtats.sendEvent(evenement);
    }
    
    public EtatsCommande obtenirEtatCourant() {
        return machineEtats.getState().getId();
    }
}

Points critiques à considérer

  • Sécurité des threads : Les instances de Spring Statemachine sont stateful et donc non thread-safe. Utilisez un pattern factory pour créer des instances indépendantes
  • Optimisation des performances : Pour les environnements haute performance, envisagez une machine distribuée (implémentation basée sur Zookeeper)
  • Compatibilité des versions : Nécessite Spring Framework 5.x et Java 8 ou supérieur

Avantages du framework

Les machines à états sont puissantes car elles garnatissent toujours un comportement cohérent, facilitant ainsi le débogage. Les règles opérationnelles sont figées au démarrage de la machine. L'idée fondamentale est que votre application peut exister dans un nombre fini d'états, et certains déclecnheurs prédéfinis peuvent amener votre application d'un état à un autre. Ces déclencheurs peuvent être basés sur des événements ou des minuteurs.

Il est beaucoup plus facile de définir une logique de haut niveau en dehors de votre application, puis de compter sur la machine à états pour gérer les états. Vous pouvez interagir avec la machine à états en envoyant un événement, en écoutant les changements ou simplement en demandant l'état actuel.

Étiquettes: spring-statemachine Java State-Machine spring-boot workflow-management

Publié le 30 septembre à 15h30