2010-08-19 6 views
2

나는 Apache Commons SCXML을 사용하고 있으며, 주어진 상태로 점프하도록 상태 머신 (SCXMLExecutor)에게 알릴 수 있는지 알고 싶습니다.Commons SCXML - 주어진 상태로 강제 점멸

스테이트 머신을 복구 (전원 장애 발생)하고 싶기 때문에 initialstate 속성을 사용할 수 없습니다. 마지막 상태는 내가 가진 유일한 것입니다. 그래서 나는 상태 머신이 직접 점프하도록 지시하는 것에 대해 생각하고있었습니다.

답변

3

일반적인 상태에서는 만족하지 않는 특정 상태의 실행에 대한 전제 조건이있을 수 있기 때문에 상태 시스템이 상태를 인식하지 않는 상태로 건너 뛰는 것은 정말 나쁜 생각입니다. 상태에 도달 "정상") 방법. 더 나은 아이디어는 "재시작"입력과 "처리"를 처리하는 데 필요한 상태 및 전환으로 구현되는 "재시작"기능으로 상태 시스템을 설계하는 것입니다.

+0

좋은 아이디어. 귀중한 의견에 감사드립니다. –

2

이것은 오래된 질문이지만이 질문에 답을 얻고 다른 사람들이 답할 수 있다고 생각했습니다. 나는 이것을 단위 테스트의 일부로 사용하고있다. 특정 상태에 도달하는 것이 매우 유용하다. (나는 상태 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); 
}