🧭 Statechart ΠΈ Spring State Machine: ΠΊΠΎΠ³Π΄Π° FSM ΡƒΠΆΠ΅ нСдостаточно

🧭 Statechart ΠΈ Spring State Machine: ΠΊΠΎΠ³Π΄Π° FSM ΡƒΠΆΠ΅ нСдостаточно

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ постС ΠΌΡ‹ рассмотрСли классичСскиС State Machine. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€Π΅Π»ΠΈ Π½Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ FSM с использованиСм Ρ‚Π°Π±Π»ΠΈΡ†. Но Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° систСма разрастаСтся ΠΈ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠ΅ трСбования:

  • Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ (иСрархичСскиС) состояния - состояниС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ подсостояния, ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΈΠ· Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ состояния влияСт Π½Π° всС Π΅Π³ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ состояния.
  • ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ (ΠΎΡ€Ρ‚ΠΎΠ³ΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅) состояния: ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… нСзависимых состояниях ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.
  • Π˜ΡΡ‚ΠΎΡ€ΠΈΡ состояний: Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ Π² послСднСС Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ подсостояниС послС Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ состояния.
  • Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅/Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ дСйствия: дСйствия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ ΠΈΠ»ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· состояния.
  • Визуализация слоТной Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ²: Π›ΠΎΠ³ΠΈΠΊΠ° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ² становится Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ большой, Ρ‡Ρ‚ΠΎ Π΅Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, посмотрСв ΠΊΠΎΠ΄, ΠΈ трСбуСтся нСкоторая визуализация.

Π—Π΄Π΅ΡΡŒ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Statechart β€” Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ FSM, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Дэвидом Π₯Π°Ρ€Π΅Π»ΠΎΠΌ Π² 1987 Π³ΠΎΠ΄Ρƒ. Бсылка Π½Π° ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΏΠΎ Statechart (здСсь Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ модифицированная ΡΡ‚Π°Ρ‚ΡŒΡ) - https://www.inf.ed.ac.uk/teaching/courses/seoc/2005_2006/resources/statecharts.pdf. ΠšΡ‚ΠΎ Π»ΡŽΠ±ΠΈΡ‚ акадСмичСскоС Ρ‡Ρ‚ΠΈΠ²ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΈ эту - https://is.ifmo.ru/works/pattern.pdf

πŸ—Ί Statechart: Π­Π²ΠΎΠ»ΡŽΡ†ΠΈΡ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΎΠ²

Основная идСя Statechart - Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ (Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… состояний), ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ° ΠΈ истории, Ρ‡Ρ‚ΠΎ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹Π΅ ΠΈ наглядныС ΠΌΠΎΠ΄Π΅Π»ΠΈ слоТных систСм.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ особСнности Statechart:

  • Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ состояния (Nested States): БостояниС ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ состояния. Π­Ρ‚ΠΎ позволяСт Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ связанныС состояния ΠΈ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ ΠΈΠ· Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ состояния ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΊΠΎ всСм Π΅Π³ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ состояниям.
  • ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ состояния (Concurrent/Orthogonal States): БостояниС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΎ Π½Π° нСсколько нСзависимых ΠΎΡ€Ρ‚ΠΎΠ³ΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… областСй, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ свой собствСнный ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚. Π­Ρ‚ΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅Ρ‚ ситуации, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ выполняСт нСсколько нСзависимых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.
  • Π˜ΡΡ‚ΠΎΡ€ΠΈΡ (History Pseudo-States): ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Ρƒ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ послСднСС Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ подсостояниС Π² составном состоянии, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ Π²Ρ…ΠΎΠ΄Π΅ Π² Π½Π΅Π³ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² это подсостояниС.
  • Entry/Exit Actions: ДСйствия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ Π² состояниС ΠΈΠ»ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· Π½Π΅Π³ΠΎ.
  • Internal Transitions: ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ состояния Π±Π΅Π· Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Π½Π΅Π³ΠΎ.

Statechart являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ UML (Unified Modeling Language), Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ ΡˆΠΈΡ€ΠΎΠΊΠΎ распространСнным ΠΈ понятным инструмСнтом для модСлирования повСдСния систСм. Statechart идСально ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для систСм с мноТСством взаимосвязанных состояний, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² workflow-Π΄Π²ΠΈΠΆΠΊΠ°Ρ… ΠΈΠ»ΠΈ IoT-устройствах.

✍ Spring State Machine: рСализация Statechart Π½Π° Java

Spring State Machine (SSM) β€” это Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ Statechart для Spring-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Он ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ состояний ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ², мноТСство возмоТностСй для Π³ΠΈΠ±ΠΊΠΎΠΉ настройки, ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Spring-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ возмоТности Spring State Machine:

  • Π”Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅: Бостояния ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ (Java-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ XML).
  • Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ состояния: Полная ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° иСрархичСских состояний.
  • ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ состояния: Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ процСссы.
  • ДСйствия (Actions): МоТно ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ дСйствия ΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°ΠΌ, Π²Ρ…ΠΎΠ΄Ρƒ/Π²Ρ‹Ρ…ΠΎΠ΄Ρƒ ΠΈΠ· состояний.
  • УсловныС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ (Guards): Условия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ для осущСствлСния ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°.
  • Бобытия (Events): ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для запуска ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ².
  • ΠŸΠ΅Ρ€ΡΠΈΡΡ‚Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ (Persistence): Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈ Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ состояниС ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Π‘Π”).
  • ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³: Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с Spring Actuator для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° состояния ΠΌΠ°ΡˆΠΈΠ½Ρ‹.
  • Визуализация: МоТно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ состояния ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ состояний Ρ‡Π΅Ρ€Π΅Π· eclipse Papyrus framework (ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π²Ρ‹Π±ΠΎΡ€ ΠΏΠ°Π» Π½Π° Papyrus ΠΌΠ½Π΅ Π½Π΅ ясно, Π½ΠΎ Ρ…ΠΎΡ‚ΡŒ Ρ‚Π°ΠΊ), Π²ΠΎΡ‚ Ρ‚ΡƒΡ‚ описано ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ - https://docs.spring.io/spring-statemachine/docs/current/reference/#sm-papyrus.

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования Spring State Machine для сцСнария "ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запроса", с Π±ΠΎΠ»Π΅Π΅ слоТной Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ состояния.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Запроса с Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ Бостояниями

ΠŸΡƒΡΡ‚ΡŒ, нашС состояниС PROCESSING ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π΅Ρ‚Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π½Π° подсостояния: INITIALIZING, EXECUTING, FINALIZING.

/ ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ для состояний ΠΈ событий enum States { IDLE, PROCESSING, PROCESSING_INITIALIZING, PROCESSING_EXECUTING, PROCESSING_FINALIZING, COMPLETED, ERROR } enum Events { START, INITIALIZE_DONE, EXECUTE_DONE, FINALIZE_DONE, SUCCESS, FAIL, RESET }

Π‘Π°ΠΌΠ° конфигурация StateMachine с Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρƒ состояниями, условиями ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ состояниями Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

@Configuration @EnableStateMachine public class RequestStateMachineConfig extends StateMachineConfigurerAdapter<States, Events> { @Override public void configure(StateMachineConfigurationConfigurer<States, Events> config) throws Exception { config .withConfiguration() .autoStartup(true) .listener(new StateMachineListener()); // Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Ρ для логирования } @Override public void configure(StateMachineStateConfigurer<States, Events> states) throws Exception { states .withStates() .initial(States.IDLE) .state(States.COMPLETED) .state(States.ERROR) .state(States.PROCESSING, processingActions()) // ДСйствия для Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ состояния PROCESSING .end(States.COMPLETED) // ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ состояния для Π²Π΅Ρ‚ΠΊΠΈ .end(States.ERROR) .and() .withStates() .parent(States.PROCESSING) // ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ состояния .initial(States.PROCESSING_INITIALIZING) .state(States.PROCESSING_EXECUTING) .state(States.PROCESSING_FINALIZING); } @Override public void configure(StateMachineTransitionConfigurer<States, Events> transitions) throws Exception { transitions .withExternal() .source(States.IDLE).target(States.PROCESSING).event(Events.START) .action(startProcessingAction()) .and() .withExternal() .source(States.PROCESSING_INITIALIZING).target(States.PROCESSING_EXECUTING) .event(Events.INITIALIZE_DONE) .action(initializeDoneAction()) .and() .withExternal() .source(States.PROCESSING_EXECUTING).target(States.PROCESSING_FINALIZING).event(Events.EXECUTE_DONE) .action(executeDoneAction()) .and() .withExternal() .source(States.PROCESSING_FINALIZING).target(States.COMPLETED).event(Events.FINALIZE_DONE) .action(finalizeDoneAction()) .and() .withExternal() .source(States.PROCESSING).target(States.ERROR).event(Events.FAIL) // ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΈΠ· Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ состояния .action(failAction()) .and() .withExternal() .source(States.COMPLETED).target(States.IDLE).event(Events.RESET) .action(resetAction()) .and() .withExternal() .source(States.ERROR).target(States.IDLE).event(Events.RESET) .action(resetAction()); } // ДСйствия (Actions) public Action<States, Events> startProcessingAction() { return context -> System.out.println("Entering PROCESSING state from IDLE."); } public Action<States, Events> initializeDoneAction() { return context -> System.out.println("Processing: Initializing done. Moving to EXECUTING."); } // .... // Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ состояний static class LoggingStateStateMachineListener extends StateMachineListenerAdapter<States, Events> { @Override public void stateChanged(State<States, Events> from, State<States, Events> to) { if (from != null) { System.out.println("Transition: " + from.getId() + " -> " + to.getId()); } else { System.out.println("Initial state: " + to.getId()); } } } }

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Ρ‡Π΅Ρ€Π΅Π· запуск:

@SpringBootApplication public class SpringFsmDemoApplication implements CommandLineRunner { @Autowired private StateMachine<States, Events> stateMachine; public static void main(String[] args) { SpringApplication.run(SpringFsmDemoApplication.class, args); } @Override public void run(String... args) throws Exception { System.out.println("Current state: " + stateMachine.getState().getId()); stateMachine.sendEvent(Events.START); System.out.println("Current state: " + stateMachine.getState().getId()); // Π”ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ PROCESSING_INITIALIZING stateMachine.sendEvent(Events.INITIALIZE_DONE); System.out.println("Current state: " + stateMachine.getState().getId()); // Π”ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ PROCESSING_EXECUTING stateMachine.sendEvent(Events.EXECUTE_DONE); System.out.println("Current state: " + stateMachine.getState().getId()); // Π”ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ PROCESSING_FINALIZING stateMachine.sendEvent(Events.FINALIZE_DONE); System.out.println("Current state: " + stateMachine.getState().getId()); // Π”ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ COMPLETED stateMachine.sendEvent(Events.RESET); System.out.println("Current state: " + stateMachine.getState().getId()); // Π”ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ IDLE } }

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° доступСн ΠΏΠΎ ссылкС.

πŸ“Œ Π’Ρ‹Π²ΠΎΠ΄Ρ‹

Statechart ΠΈ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Spring State Machine, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΌΠΎΡ‰Π½Ρ‹ΠΉ ΠΈ Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для модСлирования ΠΈ управлСния слоТным ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ систСмы. Они ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ состояний ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ², Π½ΠΎ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с иСрархичСскими ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ состояниями, Ρ‡Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ИспользованиС срСдств Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ процСсс докумСнтирования ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, дСлая State Machine Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌΡ‹ΠΌ инструмСнтом Π² арсСналС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°.

Подпишись на мой канал в telegram

2
3 коммСнтария