我正在運行一個分層 Spring 狀態機,并且 - 在通過初始轉換進入狀態 UP 并使用默認子狀態 STOPPED - 想要使用statemachine.getState()。麻煩的是,它只給了我父狀態 UP,我找不到一個明顯的方法來檢索父狀態和子狀態。
該機器具有如下構造的狀態:
StateMachineBuilder.Builder<ToolStates, ToolEvents> builder = StateMachineBuilder.builder();
builder.configureStates()
.withStates()
.initial(ToolStates.UP)
.state(ToolStates.UP, new ToolUpEventAction(), null)
.state(ToolStates.DOWN
.and()
.withStates()
.parent(ToolStates.UP)
.initial(ToolStates.STOPPED)
.state(ToolStates.STOPPED,new ToolStoppedEventAction(), null )
.state(ToolStates.IDLE)
.state(ToolStates.PROCESSING,
new ToolBeginProcessingPartAction(),
new ToolDoneProcessingPartAction());
...
builder.build();
ToolStates并且ToolEvents只是列舉。在客戶端類中,運行上面的構建器代碼后,狀態機啟動statemachine.start();時,我隨后呼叫statemachine.getState().getId();它給了我UP。在該呼叫之前沒有事件發送到狀態機。我一直在查看 Spring 狀態機檔案和示例。我從除錯中知道這兩種狀態的進入動作UP和STOPPED已被呼叫,所以我假設它們都是“活動的”,并且希望在查詢狀態機時同時呈現兩種狀態。有沒有一種干凈的方法來實作這一目標?我想避免將子狀態存盤在 Action 類內部的某個地方,因為我相信我首先將所有狀態管理問題委托給了該死的狀態機,我更愿意學習如何為此目的使用它的 API。
希望這是一件令人尷尬的事情……
歡迎任何建議!
uj5u.com熱心網友回復:
該檔案描述getStates():
https://docs.spring.io/spring-statemachine/docs/current/api/org/springframework/statemachine/state/State.html
java.util.Collection<State<S,E>> getStates()
Gets all possible states this state knows about including itself and substates.
stateMachine.getState().getStates();
uj5u.com熱心網友回復:
在 SMA 最有用的建議之后總結一下:stateMachine.getState().getStates();在我的情況下,確實回傳了四個元素的串列:
一個包含和的
StateMachineState實體UPSTOPPED三個
ObjectState實體分別包含IDLE和。STOPPEDPROCESSING
這導致我暫時采用以下解決方案:
public List<ToolStates> getStates() {
List<ToolStates> result = new ArrayList<>();
Collection<State<ToolStates, ToolEvents>> states = this.stateMachine.getState().getStates();
Iterator<State<ToolStates, ToolEvents>> iter = states.iterator();
while (iter.hasNext()) {
State<ToolStates, ToolEvents> candidate = iter.next();
if (!candidate.isSimple()) {
Collection<ToolStates> ids = candidate.getIds();
Iterator<ToolStates> i = ids.iterator();
while (i.hasNext()) {
result.add(i.next());
}
}
}
return result;
}
通過一些流式傳輸和過濾,這可能會更優雅,但現在就可以了。不過我不太喜歡。這是很多容易出錯的邏輯,我必須看看它是否在未來成立 - 我想知道為什么 Spring Statemachine 中沒有一個函式可以為我提供所有當前活動狀態 的列舉值串列,而不是給我一切可能的東西并強迫我用外部邏輯在其中四處尋找......
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/459160.html
