[] taskService.completeTask(task.getId());的执行过程分析_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > [] taskService.completeTask(task.getId());的执行过程分析

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

 2011/10/13 8:12:37  itoracja  http://itoracja.iteye.com  我要评论(0)
  • 摘要:taskservice.completetask(task.getid());单步跟踪下去的顺序1、执行函数体内,得到dbid,感觉是注入到这个id去的。在taskimpl中有setdbid的方法2、commandservice.execute(newcompletetaskcmd(taskid));3、在completetaskcmd中,publicvoidexecute(environmentenvironment)throwsexception{//要从数据库中取数据
  • 标签:Service 执行 过程 分析
    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网理论上,应该可以是类似的
 
发表评论
用户名: 匿名