taskService.completeTask(task.getId());的执行过程分析

taskService.completeTask(task.getId());
单步跟踪下去的顺序
1、执行函数体内,得到dbid,感觉是注入到这个id去的。在taskimpl中有setdbid的方法
2、commandService.execute(new CompleteTaskCmd(taskId));
3、在CompleteTaskCmd中,public Void execute(Environment environment) throws Exception
{
//要从数据库中取数据,因为task是在进入节点的时候,产生到数据库中的

   TaskImpl task = dbSession.get(TaskImpl.class, Long.parseLong(taskId));


    if (outcomeSpecified) {
      task.complete(outcome);
    } else {
      task.complete(); 
    }
}
在Complete中
//它在历史事件中Update了historytask,主要是更新了endtime及setTransitionName
   
historyTaskComplete(outcome);
//在historyEvent 基类下,有taskCreate等多个子类,每个子类,都采用模板的Process的方式。说明任务在创建到结束的时候,该事件都会被启动
   
    DbSession dbSession = EnvironmentImpl.getFromCurrent(DbSession.class, false);
    if (dbSession!=null){
      dbSession.delete(this);//应该是删除task本身的任务
    }

    if (isSignalling()) {
      ClientExecution execution = getExecution();
      execution.signal(outcome);
//进入了ExecutionImpl的signal的方法
public void signal(String signal, Map<String, ?> parameters) {
    checkActive();
    if (getProcessDefinition().isSuspended()) {
      throw new JbpmException("process definition "+getProcessDefinition().getId()+" is suspended");
    }
    propagation = Propagation.EXPLICIT;
    if (getActivity()!=null) {
      performAtomicOperation(new Signal(signal, parameters));
//signal也是AtomicOperation子类,但是这个时候,无法通过字符串常量方式写入。
在这里面,主要执行了
activityBehaviour.signal(execution, signalName, parameters);
进入了taskActivity(是activityBehaviour的子类)的signal中。

execution.fire(signalName, activity);在这个fire中,产生了事件的原子操作
    AtomicOperation.EXECUTE_EVENT_LISTENER。
然后进入了 public void take(Transition transition) {
fire(Event.END, getActivity(), AtomicOperation.TRANSITION_END_ACTIVITY);
然后执行 TransitionTake
然后执行 TRANSITION_START_ACTIVITY


感觉在 while (! atomicOperations.isEmpty()) {
          AtomicOperation atomicOperation = atomicOperations.poll();
          atomicOperation.perform(this);
        }
处使用了递归的过程

}

    }
    else if (transition != null) {
      performAtomicOperation(AtomicOperation.TRANSITION_START_ACTIVITY);
    }
    else {
      throw new JbpmException("execution is not in a activity or in a transition");
    }
  }


//
    }
   
    if (superTask != null) {
      superTask.subTaskComplete(this, outcome);
    }


感觉:在Atomic几个子类操作的互转过程,与信号量的Perti网理论上,应该可以是类似的

猜你喜欢

转载自sunsteven.iteye.com/blog/1036026