2016-07-01 1 views
0

내 상태 시스템 빌더를 사용하여 내 시스템에 상태 시스템을 구축하고 있습니다. 또한 응용 프로그램에는 org.springframework.statemachine.action.Action을 구현하는 Action 클래스가 있습니다. 이 Action 클래스는 각 스테이지에 대한 입력 작업을 실행하기위한 클래스입니다. execute (StateContext paramStateContext) 메서드와 같은 이러한 Action 클래스에서 예외가 발생하면 오류 세부 정보가있는 db를 업데이트 한 후 해당 예외를 catch하고 이벤트 (Terminated)를 보내고 상태 시스템을 End 상태로 전환하려고합니다. stateMachineError (StateMachine stateMachine, Exception e) 메서드를 재정 의하여 상태 시스템 수신기를 사용하려고했습니다. 그러나 불행히도 이것은 작동하지 않습니다. 다른 모든 스프링 상태 머신 구성 요소가 catch를 try로 catch하고 End 클래스가 End 상태를 탐색하도록 Terminated 이벤트를 보내는 catch 블록 내에서 전체 코드를 래핑하기 전에 예외를 catch하는 다른 스프링 상태 시스템 구성 요소. 여기에 Iam을 사용하는 빌더가 있습니다.스프링 상태 머신의 입력 작업 클래스에서 코드/구성 오류 처리

+0

도움 말 .. 많이 감사합니다. – user2330825

답변

0

당신이 맞아요 스프링 상태 기 코어, 어느 stateMachineError 또는 @onStateMachineError 주석이 방법의 1.1.0.RELEASE 버전을 사용


private StateMachineListener<String, String> listener() { 
     return new StateMachineListenerAdapter<String, String>() { 
      @Override 
      public void stateChanged(
        org.springframework.statemachine.state.State<String, String> from, 
        org.springframework.statemachine.state.State<String, String> to) { 
       LOGGER.debug("State change to " + to.getId()); 
      } 

      @Override 
      public void stateMachineError(
        StateMachine<String, String> stateMachine, Exception e) { 
       e.printStackTrace(); 
       LOGGER.debug("Ah... I am not getting executed when exception occurs from entry actions"); 
       LOGGER.debug("Error occured from " + stateMachine.getState() 
         + "and the error is" + e.toString()); 
      } 
     }; 
    } 

스피

Builder<String, String> builder = StateMachineBuilder 
       .<String, String> builder(); 
     builder.configureConfiguration() 
     .withConfiguration() 
     .autoStartup(false) 
     .listener(listener()) 
       .beanFactory(
       this.applicationContext.getAutowireCapableBeanFactory()); 

는 오류에서 실행됩니다. 이것은 현재 버전 1.0에있는 버전 1.2에서 해결되었습니다. 그들은 상태 머신 컨텍스트와 실행 errorAction 소개 :

사용자는 항상 수동으로 예외를 잡을 수 있지만, 작업 전환에 대한 정의와 함께 예외가 발생하면 호출 오류 동작을 정의 할 수 있습니다. 그런 다음 해당 작업에 전달 된 StateContext에서 예외를 사용할 수 있습니다.

상태 시스템 구성 클래스에서 전환을 정의 할 때 원하는 작업과 함께 오류 조치를 지정하면됩니다. example in the documentation에서 :

public void configure(StateMachineTransitionConfigurer<States, Events> transitions) 
     throws Exception { 
    transitions 
     .withExternal() 
      .source(States.S1) 
      .target(States.S2) 
      .event(Events.E1) 
      .action(action(), errorAction()); 
} 

이에 대한 자세한 설명은 봄 상태 기 issue #240에서 찾을 수 있습니다.