我正在使用Apache Commons SCXML,我想知道是否可以告訴狀態機(SCXMLExecutor)跳轉到給定狀態。Commons SCXML - 強制跳轉到給定狀態
我不能使用initialstate
屬性,因爲我希望狀態機恢復(即從電源故障),我唯一擁有的是最後一個狀態。這就是爲什麼我正在考慮告訴狀態機直接跳到它。
我正在使用Apache Commons SCXML,我想知道是否可以告訴狀態機(SCXMLExecutor)跳轉到給定狀態。Commons SCXML - 強制跳轉到給定狀態
我不能使用initialstate
屬性,因爲我希望狀態機恢復(即從電源故障),我唯一擁有的是最後一個狀態。這就是爲什麼我正在考慮告訴狀態機直接跳到它。
在一般情況下,跳轉到沒有狀態機「知道」它的狀態是一個非常糟糕的主意,因爲對於特定狀態的執行可能存在不滿足的前提條件(如果你達到了「正常」狀態)。更好的想法是設計具有「重啓」功能的狀態機,作爲輸入「重啓」事件以及處理它的狀態和轉換來實現。
這是一個古老的問題,但我只是打了這個,需要一個答案,並認爲它可以幫助別人回答它。我使用它作爲單元測試的一部分,它對於進入特定狀態非常有用(我想確保如果在狀態A,如果發生一系列事件,它會進入狀態B - 並且仍然會之後我修改了狀態機XML!)
我終於在SCXMLTestHelper中找到了這段代碼,它工作正常。只需使用執行程序和目標狀態調用它即可。
public static void setCurrentState(SCXMLExecutor exec, final String id) throws IllegalArgumentException{
try {
exec.reset();
} catch (ModelException me) {
throw new IllegalArgumentException("Provided SCXMLExecutor "
+ "instance cannot be reset.");
}
TransitionTarget active = (TransitionTarget) exec.getStateMachine().
getTargets().get(id);
if (active == null) {
throw new IllegalArgumentException("No target with id '" + id
+ "' present in state machine.");
}
Set current = exec.getCurrentStatus().getStates();
current.clear();
current.add(active);
}
好主意。感謝您的寶貴意見。 – 2010-08-20 07:02:04