2017-08-16 2 views
0

1, j'ai créé des données de configuration de la machine à la base de données par le Web;pourquoi ne fonctionne pas statemachine de travail, quand je crée statemachine par stateMachineFactory?

@Override 
public void createMachine(MachineCfgDto data) { 
    String machineId = data.getName(); 
    Set<String> status = new HashSet<String>(); 
    String initStatus = null; 
    for(int i=0;i<data.getCfg().size();i++) { 
     if(i==0) { 
      initStatus =data.getCfg().get(i).getSrc(); 
     } 
     status.add(data.getCfg().get(i).getSrc()); 
     status.add(data.getCfg().get(i).getTarget()); 
    } 
    Map<String,JpaRepositoryState> machineStatus = new HashMap<String,JpaRepositoryState>(); 
    for(String s : status) { 
     JpaRepositoryState mStatus = stateRepository.save(new JpaRepositoryState(machineId,s,initStatus.equals(s)?true:false)); 
     machineStatus.put(s, mStatus); 
    } 

    for(CfgData cfg : data.getCfg()) { 
     JpaRepositoryTransition trans = new JpaRepositoryTransition(machineStatus.get(cfg.getSrc()),machineStatus.get(cfg.getTarget()),cfg.getEvent()); 
     trans.setKind(TransitionKind.EXTERNAL); 
     transitionRepository.save(trans); 
    } 
} 

2, je créé StateMachine par StateMachineFactory et commencer, puis j'envoyer un événement par la méthode sendEvent de StateMachine, mais il dose pas bien travailler;

@Override 
public void submit(String machineId, String curStatus,Long[] ids) { 
    StateMachine<String, String> machine = stateMachineFactory.getStateMachine(machineId); 
    PersistStateMachineHandler handler = new PersistStateMachineHandler(machine); 
    handler.addPersistStateChangeListener(new TestListener(jdbcTemplate)); 
    System.out.println("状态机是否终结:" + machine.isComplete() + "machine-uuid:"+machine.getUuid()); 
    State<String, String> s = machine.getInitialState(); 
    System.out.println("状态id:" + s.getId()); 
    if(machine.isComplete()) { 
     machine.start(); 
    } 
    machine.sendEvent("start"); 
    System.out.println("状态机是否终结:" + machine.isComplete()+ machine.getState().getId()); 
    handler.handleEventWithState(MessageBuilder.withPayload("start").setHeader("ids", ids).build(), curStatus); 

} 

après sendEvent, est modifie pas l'état actuel de la machine, son état initial « S0 » tout le temps, s'il vous plaît me dire pourquoi ou comment CORRENT en utilisant StateMachine printemps, merci!

et dans ce cas, j'utilise Persit, mais il ne travaille pas trop

Répondre

0

désolé, je trouve le problème! lorsque je crée la transation, j'oublie de mettre machineId à it.So, en utilisant la machine par sendEvent, n'ont pas de transation.