类 StateMachineTask<E>

java.lang.Object
cn.wjybxx.btree.Task<E>
cn.wjybxx.btree.Decorator<E>
cn.wjybxx.btree.fsm.StateMachineTask<E>

public class StateMachineTask<E> extends Decorator<E>
状态机节点 1.redo和undo是很有用的特性,因此我们在顶层给予支持,但默认的队列不会保存状态。 2.以我的经验来看,状态机是最重要的节点,Join则是是仅次于状态机的节点 -- 不能以使用数量而定。
作者:
wjybxx date - 2023/12/1
  • 构造器详细资料

    • StateMachineTask

      public StateMachineTask()
  • 方法详细资料

    • getCurState

      public final Task<E> getCurState()
      获取当前状态
    • getTempNextState

      public final Task<E> getTempNextState()
      获取临时的下一个状态
    • discardTempNextState

      public final Task<E> discardTempNextState()
      丢弃未切换的临时状态
    • cancelCurState

      public final void cancelCurState(int cancelCode)
      对当前当前状态发出取消命令
    • peekUndoState

      public final Task<E> peekUndoState()
      查看undo对应的state
    • peekRedoState

      public final Task<E> peekRedoState()
      查看redo对应的state
    • getUndoQueue

      public final Deque<Task<E>> getUndoQueue()
      开放以允许填充
    • getRedoQueue

      public final Deque<Task<E>> getRedoQueue()
      开放以允许填充
    • setUndoQueueSize

      public final Deque<Task<E>> setUndoQueueSize(int maxSize)
      参数:
      maxSize - 最大大小;0表示禁用;大于0启用
      返回:
      最新的queue
    • setRedoQueueSize

      public final Deque<Task<E>> setRedoQueueSize(int maxSize)
      参数:
      maxSize - 最大大小;0表示禁用;大于0启用
      返回:
      最新的queue
    • undoChangeState

      public final boolean undoChangeState()
      撤销到前一个状态
      返回:
      如果有前一个状态则返回true
    • undoChangeState

      public final boolean undoChangeState(ChangeStateArgs changeStateArgs)
      撤销到前一个状态
      参数:
      changeStateArgs - 状态切换参数
      返回:
      如果有前一个状态则返回true
    • redoChangeState

      public final boolean redoChangeState()
      重新进入到下一个状态
      返回:
      如果有下一个状态则返回true
    • redoChangeState

      public final boolean redoChangeState(ChangeStateArgs changeStateArgs)
      重新进入到下一个状态
      参数:
      changeStateArgs - 状态切换参数
      返回:
      如果有下一个状态则返回true
    • changeState

      public final void changeState(Task<E> nextState)
      切换状态 -- 如果状态机处于运行中,则立即切换
    • changeState

      public void changeState(Task<E> nextState, ChangeStateArgs changeStateArgs)
      切换状态 1.如果当前有一个待切换的状态,则会被悄悄丢弃(可以增加一个通知) 2.无论何种模式,在当前状态进入完成状态时一定会触发 3.如果状态机未运行,则仅仅保存在那里,等待下次运行的时候执行 4.当前状态可先正常完成,然后再切换状态,就可以避免进入被取消状态;可参考ChangeStateTask
      
            Task<E> nextState = nextState();
            setSuccess();
            stateMachine.changeState(nextState)
       
       
      参数:
      nextState - 要进入的下一个状态
      changeStateArgs - 状态切换参数
    • checkArgs

      protected final ChangeStateArgs checkArgs(ChangeStateArgs changeStateArgs)
      检测正确性和自动初始化;不可修改掉cmd
    • resetForRestart

      public void resetForRestart()
      从类复制的说明: Task
      重置任务以便重新启动(清理运行产生的所有临时数据)

      1. 和exit一样,清理的是运行时产生的临时数据,而不是所有数据;不过该方法是比exit更彻底的清理。 2. 钩子任务也应当被重置,可重写Task.resetChildrenForRestart()或该方法清理。 3. 与Task.beforeEnter()相同,重写方法时,应先执行父类逻辑,再重置自身属性。 4. 有临时数据的Task都应该重写该方法,行为树通常是需要反复执行的。

      覆盖:
      resetForRestart 在类中 Task<E>
    • beforeEnter

      protected void beforeEnter()
      从类复制的说明: Task
      该方法用于初始化对象。 1.不命名为init,是因为init通常让人觉得只调用一次。 2.该方法不可以使自身进入完成状态。
      覆盖:
      beforeEnter 在类中 Task<E>
    • exit

      protected void exit()
      从类复制的说明: Task
      该方法在Task进入完成状态时执行 1.该方法与Task.enter(int)对应,通常用于停止Task.enter(int)中启动的逻辑。 2.该方法也用于清理部分运行时产生的临时数据。 3.一定记得取消注册的各种监听器。
      覆盖:
      exit 在类中 Task<E>
    • execute

      protected void execute()
      从类复制的说明: Task
      Task的心跳方法,在Task进入完成状态之前会反复执行。 1.可以根据Task.isExecuteTriggeredByEnter()判断是否是与Task.enter(int)连续执行的。 2.运行中可通过Task.setSuccess()Task.setFailed(int) ()}、Task.setCancelled()将自己更新为完成状态。 3.不建议直接调用该方法,而是通过模板方法运行。
      指定者:
      execute 在类中 Task<E>
    • onChildCompleted

      protected void onChildCompleted(Task<E> child)
      从类复制的说明: Task
      子节点进入完成状态 1.避免方法数太多,实现类测试task的status即可 2.Task.getNormalizedStatus()有助于switch测试 3.task可能是取消状态,甚至可能没运行过直接失败(前置条件失败) 4.钩子任务和guard不会调用该方法 5.Task.isExecuting()有助于检测冲突,减少调用栈深度 6.同一子节点连续通知的情况下,completed的逻辑应当覆盖Task.onChildRunning(Task)的影响。 7.任何的回调和事件方法中都由用户自身检测取消信号
      指定者:
      onChildCompleted 在类中 Task<E>
    • onNoChildRunning

      protected final void onNoChildRunning()
    • isReady

      protected final boolean isReady(@Nullable Task<E> curState, Task<?> nextState)
    • notifyChangeState

      protected final void notifyChangeState(@Nullable Task<E> curState, @Nullable Task<E> nextState)
    • findStateMachine

      public static <E> StateMachineTask<E> findStateMachine(Task<E> task)
      查找task最近的状态机节点 1.仅递归查询父节点和长兄节点 2.优先查找附近的,然后测试长兄节点 - 状态机作为第一个节点的情况比较常见
    • findStateMachine

      @Nonnull public static <E> StateMachineTask<E> findStateMachine(Task<E> task, String name)
      查找task最近的状态机节点 1.名字不为空的情况下,支持从兄弟节点中查询 2.优先测试父节点,然后测试兄弟节点
    • getInitState

      public Task<E> getInitState()
    • setInitState

      public void setInitState(Task<E> initState)
    • getInitStateProps

      public Object getInitStateProps()
    • setInitStateProps

      public void setInitStateProps(Object initStateProps)
    • getName

      public String getName()
    • setName

      public void setName(String name)
    • getNoneChildStatus

      public int getNoneChildStatus()
    • setNoneChildStatus

      public void setNoneChildStatus(int noneChildStatus)
    • getListener

      public StateMachineListener<E> getListener()
    • setListener

      public void setListener(StateMachineListener<E> listener)
    • getStateMachineHandler

      public StateMachineHandler<E> getStateMachineHandler()
    • setStateMachineHandler

      public void setStateMachineHandler(StateMachineHandler<E> stateMachineHandler)