16 KiB
16 KiB
ScriptEngine State Machine Architecture / Kiến trúc State Machine cho ScriptEngine
📋 Overview / Tổng quan
Tài liệu này mô tả kiến trúc state machine cho module ScriptEngine sử dụng Appccelerate.StateMachine. Module ScriptEngine có 3 state machine chính:
- TaskStateMachine - Quản lý state của Task (periodic execution)
- MissionStateMachine - Quản lý state của Mission (long-running workflow)
- EngineManagerStateMachine - Quản lý state của ScriptEngine Manager
🎯 State Machine Definitions / Định nghĩa State Machine
1. Task State Machine
States / Trạng thái
public enum ScriptTaskState
{
Idle = 0,
Running,
Pausing,
Paused,
Resuming,
Stopping,
Stopped,
Error,
}
Triggers / Sự kiện
Public Triggers (có thể gọi từ bên ngoài):
Start- Bắt đầu taskPause- Tạm dừng task (timer tiếp tục chạy, chỉ skip execution)Resume- Tiếp tục task (timer đã chạy, chỉ enable execution lại)Stop- Dừng task (dừng timer và cleanup)
Internal Triggers (tự động fire khi operation hoàn thành):
PausingCompleted- Hoàn thành quá trình pausingResumingCompleted- Hoàn thành quá trình resumingStoppingCompleted- Hoàn thành quá trình stoppingErrorOccurred- Xảy ra lỗi
State Transition Diagram / Sơ đồ Chuyển đổi Trạng thái
stateDiagram-v2
[*] --> Idle
Idle --> Running: Start
Running --> Pausing: Pause
Running --> Stopping: Stop
Running --> Error: ErrorOccurred
Pausing --> Paused: PausingCompleted
Pausing --> Error: ErrorOccurred
Paused --> Resuming: Resume
Paused --> Stopping: Stop
Resuming --> Running: ResumingCompleted
Resuming --> Error: ErrorOccurred
Stopping --> Stopped: StoppingCompleted
Stopping --> Error: ErrorOccurred
Stopped --> Running: Start
Error --> Running: Start
note right of Running
Task đang chạy định kỳ
theo interval
Timer/Realtime loop đang chạy
end note
note right of Paused
Task đã tạm dừng
Timer/Realtime loop vẫn chạy
Chỉ skip execution
Có thể resume hoặc stop
end note
note right of Stopped
Task đã dừng
Timer/Realtime loop đã dừng
Có thể start lại
end note
note right of Error
Task gặp lỗi
Có thể start lại
end note
Lưu ý về Task State Machine:
- Task bắt đầu ở state
Idle - Khi ở
Running, task chạy định kỳ theo interval - Pause/Resume Behavior:
- Khi
Pause: Timer/Realtime loop vẫn tiếp tục chạy, chỉ skip execution khi timer expire - Khi
Resume: Timer/Realtime loop đã chạy, chỉ enable execution lại - Điều này đảm bảo timer không bị gián đoạn và có thể resume ngay lập tức
- Khi
- Các intermediate states (
Pausing,Resuming,Stopping) được sử dụng khi có async operations - Từ
StoppedhoặcError, có thểStartlại để vềRunning(không cần vềIdle) - Task có thể được pause/resume nhiều lần
- Task có thuộc tính
AutoStart(mặc địnhtrue) - khiAutoStart = true, task sẽ tự động start khi Engine chuyển sangRunning - Khi Engine chuyển sang
Stopping, tất cả Tasks phải stop và vềStopped - Enable/Disable là API level, Pause/Resume là state machine level:
Enable()=Resume()- chuyển từPaused→Resuming→RunningDisable()=Pause()- chuyển từRunning→Pausing→PausedStoppedchỉ xảy ra khi Engine stop, không phải khi Disable
- Dispose:
Dispose()method được gọi trực tiếp, không qua state machine trigger. Dispose có thể được gọi từ bất kỳ state nào và sẽ tự động stop task nếu đang running trước khi cleanup
2. Mission State Machine
States / Trạng thái
public enum ScriptMissionState
{
Idle = 0,
Running,
Canceling,
Pausing,
Paused,
Resuming,
Canceled,
Completed,
Error,
}
Triggers / Sự kiện
Public Triggers:
Start- Bắt đầu missionCancel- Hủy missionPause- Tạm dừng missionResume- Tiếp tục mission
Internal Triggers:
CompleteCanceling- Hoàn thành quá trình cancelingCompletePausing- Hoàn thành quá trình pausingCompleteResuming- Hoàn thành quá trình resumingCompleteRunning- Hoàn thành mission (success)ErrorOccurred- Xảy ra lỗi
State Transition Diagram / Sơ đồ Chuyển đổi Trạng thái
stateDiagram-v2
[*] --> Idle
Idle --> Running: Start
Running --> Canceling: Cancel
Running --> Pausing: Pause
Running --> Completed: CompleteRunning
Running --> Error: ErrorOccurred
Canceling --> Canceled: CompleteCanceling
Canceling --> Error: ErrorOccurred
Pausing --> Paused: CompletePausing
Pausing --> Error: ErrorOccurred
Paused --> Resuming: Resume
Paused --> Canceling: Cancel
Resuming --> Running: CompleteResuming
Resuming --> Error: ErrorOccurred
Canceled --> [*]
Completed --> [*]
Error --> [*]
note right of Running
Mission đang thực thi
IAsyncEnumerable execution
end note
note right of Paused
Mission đã tạm dừng
Có thể resume hoặc cancel
end note
Lưu ý về Mission State Machine:
- Mission vs MissionInstance:
Missionlà method được khai báo trong script với[Mission]attribute (không có state machine)MissionInstancelà instance được tạo từ Mission method khi gọiCreateMission()(có state machine)- State machine này quản lý state của MissionInstance, không phải Mission class
- MissionInstance bắt đầu ở state
Idle - Khi ở
Running, MissionInstance thực thi IAsyncEnumerable workflow - Có thể pause/resume MissionInstance trong quá trình execution thông qua cơ chế
MoveNext()của IAsyncEnumerable - Terminal states (
Completed,Canceled,Error) là final states - không thể transition từ đây - Mỗi MissionInstance chỉ chạy một lần, sau khi complete/cancel/error thì không thể reuse
- Để chạy lại mission, phải tạo MissionInstance mới
- Khi Engine chuyển sang
Stopping, các MissionInstance đangRunningsẽ bị cancel và chờ vềCanceled - MissionInstance Lifecycle: Khi MissionInstance về terminal states (
Completed,Canceled,Error):- Lưu trạng thái, log và score vào database
- Dispose MissionInstance
3. Engine Manager State Machine
States / Trạng thái
public enum ScriptEngineState
{
Initializing = 0,
Resetting,
Idle,
Building,
Ready,
Starting,
Running,
Stopping,
BuildError,
Fault,
}
Triggers / Sự kiện
Public Triggers:
Reset- Reset engine về IdleBuild- Build scriptsStart- Start engine (enable tasks/missions)Stop- Stop engine
Internal Triggers:
InitializationCompleted- Hoàn thành initialization (tự động chuyển từ Initializing → Idle)ResettingCompleted- Hoàn thành resetBuildingCompleted- Hoàn thành buildStartingCompleted- Hoàn thành startingStoppingCompleted- Hoàn thành stoppingBuildErrorOccurred- Lỗi khi buildFaultOccurred- Lỗi hệ thống
State Transition Diagram / Sơ đồ Chuyển đổi Trạng thái
stateDiagram-v2
[*] --> Initializing
Initializing --> Resetting: Reset
Initializing --> Idle: InitializationCompleted
Resetting --> Idle: ResettingCompleted
Resetting --> Fault: FaultOccurred
Idle --> Building: Build
Idle --> Resetting: Reset
Building --> Ready: BuildingCompleted
Building --> BuildError: BuildErrorOccurred
Building --> Fault: FaultOccurred
BuildError --> Idle: Reset
BuildError --> Building: Build
Ready --> Starting: Start
Ready --> Idle: Reset
Ready --> Building: Build
Starting --> Running: StartingCompleted
Starting --> Fault: FaultOccurred
Running --> Stopping: Stop
Running --> Resetting: Reset
Running --> Fault: FaultOccurred
Stopping --> Ready: StoppingCompleted<br/>(All Tasks Stopped<br/>AND All Missions not Running)
Stopping --> Fault: FaultOccurred
Fault --> Resetting: Reset
note right of Idle
Scripts có thể được edit
và save
end note
note right of Building
Compile scripts
Extract metadata
end note
note right of Running
Tasks execute periodically
MissionInstances can be created
Tasks with AutoStart=true auto-start
end note
note right of Stopping
Wait for all Tasks to Stopped
Wait for all MissionInstances
not Running
end note
Lưu ý về Engine Manager State Machine:
- Engine bắt đầu ở state
Initializingkhi khởi động - Engine tự động chuyển từ
InitializingsangIdlekhi initialization hoàn thành Idle: Scripts có thể được edit và saveBuilding: Compile scripts và extract metadata (Tasks, Missions, Variables). Khi build thành công, sẽ tạo lại Task và Mission từ compiled scriptsReady: Scripts đã compiled thành công, sẵn sàng để start. Không thể edit scripts khi ở Ready, phải gọiResetđể vềIdlemới edit đượcStarting: Khi Engine vàoStarting, các Task cóAutoStart = truesẽ bắt đầu startRunning: Tasks và MissionInstances có thể execute. MissionInstance có thể được tạo khi Engine ởRunningStopping: Engine chỉ chuyển sangReadykhi TẤT CẢ Tasks đã vềStoppedVÀ TẤT CẢ MissionInstances không còn ở stateRunningBuildError: Lỗi khi compile, có thể reset về Idle hoặc build lạiFault: Lỗi hệ thống nghiêm trọng, cần reset để recovery- Engine chỉ có thể
BuildtừIdlehoặcBuildError. KhiRunning, chỉ có thể gọiStop - Khi Engine
Reset, TaskManager và MissionManager sẽ giải phóng (dispose) tất cả Tasks và MissionInstances
🔗 Relationships Between State Machines / Mối quan hệ giữa các State Machine
Hierarchical Relationship / Quan hệ Phân cấp
graph TB
Engine[EngineManagerStateMachine<br/>Running/Ready]
subgraph "When Engine is Running"
TaskMgr[TaskManager<br/>Collections of Tasks<br/>with StateMachines]
MissionMgr[MissionManager<br/>Collections of MissionInstances<br/>with StateMachines]
end
Engine -->|Controls| TaskMgr
Engine -->|Controls| MissionMgr
TaskMgr --> Task1[Task1: Running<br/>AutoStart=true]
TaskMgr --> Task2[Task2: Stopped<br/>AutoStart=false]
TaskMgr --> TaskN[TaskN: Running<br/>AutoStart=true]
MissionMgr --> MissionInst1[MissionInstance1: Running]
MissionMgr --> MissionInst2[MissionInstance2: Completed]
MissionMgr --> MissionInstN[MissionInstanceN: Idle]
style Engine fill:#e6ffe6
style TaskMgr fill:#e6f3ff
style MissionMgr fill:#fff0e6
State Dependencies / Phụ thuộc Trạng thái
-
EngineManager → TaskManager:
- Tasks chỉ có thể chạy khi Engine ở state
Running - Khi Engine chuyển sang
Stopping, tất cả Tasks phải stop và vềStopped - Khi Engine ở
Starting, các Task cóAutoStart = truesẽ tự động start - Task có thể được Enable/Disable khi Engine ở
Running(tương đương pause/resume) - Khi Engine
Reset, tất cả Tasks sẽ bị dispose
- Tasks chỉ có thể chạy khi Engine ở state
-
EngineManager → MissionManager:
- MissionInstance chỉ có thể start khi Engine ở state
Running - MissionInstance có thể được tạo khi Engine ở
Running - Khi Engine chuyển sang
Stopping, các MissionInstance đangRunningsẽ bị cancel và chờ vềCanceled - Engine chỉ chuyển từ
StoppingsangReadykhi TẤT CẢ MissionInstances không còn ở stateRunning - Khi Engine
Reset, tất cả MissionInstances sẽ bị dispose
- MissionInstance chỉ có thể start khi Engine ở state
-
Task và MissionInstance độc lập:
- Tasks và MissionInstances không phụ thuộc trực tiếp vào nhau
- Chúng có thể tương tác qua Variables và APIs
- Có thể chạy song song nhiều MissionInstances cùng lúc
-
Engine Lifecycle:
Building → Ready: Tạo lại Task và Mission từ compiled scriptsStarting: Các Task cóAutoStart = truebắt đầu startStopping → Ready: Chờ tất cả Tasks vềStoppedvà tất cả MissionInstances không cònRunningReset: Dispose tất cả Tasks và MissionInstances
📝 Important Clarifications / Làm rõ Quan trọng
1. Task Enable/Disable vs Pause/Resume
Đã làm rõ:
Enable/Disablelà API level (public interface cho scripts/users)Pause/Resumelà state machine level (internal state transitions)Enable()=Resume()- chuyển từPaused→Resuming→RunningDisable()=Pause()- chuyển từRunning→Pausing→Paused- Khi Task đang
Runningvà bịDisable(), sẽ chuyển sangPausingrồi mới vềPaused - Khi Task bị
Disable, state machine sẽ vềPaused(không phảiStopped) Stoppedchỉ xảy ra khi Engine stop, không phải khi Disable
2. Mission vs MissionInstance
Đã làm rõ:
Mission= method trong script với[Mission]attribute (không có state machine)MissionInstance= instance được tạo từ Mission (có state machine)- State machine quản lý state của MissionInstance, không phải Mission
3. Engine Stopping → Ready Transition
Đã làm rõ:
- Engine chỉ chuyển từ
StoppingsangReadykhi:- TẤT CẢ Tasks đã về
Stopped - VÀ TẤT CẢ MissionInstances không còn ở state
Running
- TẤT CẢ Tasks đã về
- Cần implement logic kiểm tra điều kiện này trước khi fire
StoppingCompletedtrigger
4. Task AutoStart Behavior
Đã làm rõ:
- Task có thuộc tính
AutoStart(mặc địnhtrue) - Khi Engine chuyển sang
Starting, các Task cóAutoStart = truesẽ tự động start - Task có
AutoStart = falsephải manually start
5. Engine Building → Ready
Đã làm rõ:
- Khi Engine chuyển từ
BuildingsangReady, sẽ tạo lại Task và Mission từ compiled scripts - Các Task và MissionInstance cũ sẽ bị dispose trước đó (khi Engine Reset hoặc khi bắt đầu Building)
- Flow:
Reset→ dispose Tasks/MissionInstances →Building→ compile scripts →Ready→ tạo lại Tasks/Missions từ compiled scripts
6. Engine Reset Behavior
Đã làm rõ:
- Khi Engine
Reset, TaskManager và MissionManager sẽ dispose tất cả Tasks và MissionInstances - Engine về
Idle, scripts có thể được edit
🔗 Related Documents / Tài liệu Liên quan
- ScriptEngine Overview - Tổng quan ScriptEngine
- Tasks - Chi tiết về Tasks
- Missions - Chi tiết về Missions
- Compilation - Quá trình build scripts
Last Updated: 2025-01-XX Status: Design Document Library: Appccelerate.StateMachine