其实我也没想好怎么起这个题目,这是心血来潮后的一篇记录。
背景就是:我没尝试过Camunda,生产环境也没有任何经验,只是久闻大名之后,突然心痒,所以看了一下源码,切入点集中在pvm而已。
我想看看Camunda里面的pvm到底起了什么作用,它的原理和Flowable到底有何不同,所以才有了这篇文章。
因为只耗费了数个小时而已,所以也不输出结论,以免以偏概全。另外,这只是一篇源码走读,可能稍显枯燥。
从TaskService的Complete入手,看看从一个UserTask是如何流转到另外一个UserTask的,当初看Flowable就这么入手的,所以这次依然这样了。
废话那么多,如果你还想继续看下去,那咱们就继续吧。
本文基于Camunda-7.15.0-alpha1。
这里面需要特别注意一个类:PvmAtomicOperation,按这个类里面定义的顺序,已经可以了解整个Pvm的执行过程。
从TaskService的Complete入手:
public void complete(String taskId) {
complete(taskId, null);
}复制
整个的执行过程是:
taskService.Complete
execution.signal
activityBehavior.signal
userTaskBehavior.signal -> leave //在这里触发了leave方法,一看就是离开节点
execution.dispatchDelayedEventsAndPerformOperation
ACTIVITY_LEAVE //pvm
behavior.doLeave
bpmnActivityBehavior.performDefaultOutgoingBehavior(execution)
TRANSITION_NOTIFY_LISTENER_END //pvm
TRANSITION_DESTROY_SCOPE //pvm
TRANSITION_NOTIFY_LISTENER_TAKE //pvm
TRANSITION_START_NOTIFY_LISTENER_TAKE //pvm
TRANSITION_CREATE_SCOPE //pvm
TRANSITION_NOTIFY_LISTENER_START //pvm
ACTIVITY_EXECUTE //pvm
activityBehavior.execute(execution) //进入了下一个节点复制
最后,进入下一个UserTask节点结束:
@Override
public void performExecution(ActivityExecution execution) throws Exception {
TaskEntity task = new TaskEntity((ExecutionEntity) execution);
task.insert();
// initialize task properties
taskDecorator.decorate(task, execution);
// fire lifecycle events after task is initialized
task.transitionTo(TaskState.STATE_CREATED);
}复制
我一直在找流程节点间的连接线,找入口和出口,但是一直没有Sequence这个关键字出现,后来搜索了一下,才知道pvm中的Transition就是连接线的意思(接触Activiti太少了,相关知识储备不够啊)。
这样的话就可以看到代码中的过程是:pvm控制节点离开,然后再控制连接线寻找出口,最后再控制进入下一个节点(这里只讨论UserTask到UserTask)。
我目前的简单理解就是:流程在运行当中,pvm中的对象记载了流程元素在运行过程中的情况,并且加以控制。
但是,很模糊的点在于,什么时候能够使用pvm干什么事情,这个可能需要以后有机会再尝试了。
好了,记录完毕,如果文中有错误,欢迎指正。
觉的不错?可以关注我的公众号↑↑↑