example:
repositoryService
.createDeployment()
.addClasspathResource(resourceCP)
.deploy();
当调用上述代码时activiti的内部调用流程如上述图所示.
每个DeploymentBuilder实例对应一个DeploymentEntity实例,DeploymentEntity是发布对应的持久化对象,其对应流程数据库中的act_re_deployment表.
public class DeploymentEntity implements Serializable, Deployment, PersistentObject {
private
static
final
long
serialVersionUID
= 1L;
protected
String
id
;
protected
String
name
;
protected
String
category
;
protected
Map<String, ResourceEntity>
resources
;
protected
Date
deploymentTime
;
protected
boolean
isNew
;
........................
}
为发布中添加的每个resource都对应一个ResourceEntity实例,它对应流程数据库中的act_ge_bytearray表.
资源文件在数据库中存为blob类型.
public class ResourceEntity implements Serializable, PersistentObject {
private static final long serialVersionUID = 1L;
protected String id;
protected String name;
protected byte[] bytes ;
protected String deploymentId;
protected boolean generated = false;
...............................
}
当调用DeploymentBuilder.deploy()后DeploymentBuilder.将其发布任务委托给DeployCmd.注:命令模式是activiti整个架构的基础.这使得activit的源码很是清晰明了.
真正的发布行为是DeployCmd来完成的.
它主要有两个操做
Context得到和当前执行线程的ComdmandContext栈、
ProcessEngineConfigurationImpl栈
、
ExecutionContext
y栈和
JobExecutorContext
等,他们都是
ThreadLocal变量,以保证每一个线程都有它们本身持有的不一样副本实例,屏蔽了线程的资源共享问题.
在第一步操做中关心的是CommandContext
public class CommandContext {
private
static
Logger
log
= LoggerFactory.getLogger(CommandContext.
class
);
protected
Command< ? >
command
;
protected
TransactionContext
transactionContext
;
protected
Map<Class< ? >, SessionFactory>
sessionFactories
;
protected
Map<Class< ? >, Session>
sessions
=
new
HashMap<Class< ? >, Session>();
protected
Throwable
exception
=
null
;
protected
LinkedList<AtomicOperation>
nextOperations
=
new
LinkedList<AtomicOperation>();
protected
ProcessEngineConfigurationImpl
processEngineConfiguration
;
protected
FailedJobCommandFactory
failedJobCommandFactory
;
.......................................
}
它将一个线程和session及事务对应起来以保证一次流程逻辑中定义的原子操做的正确性.
第二步操做将流程文件(bpmn.xml)转化为流程对象和将规则文件(.drl等)添加到
KnowledgeBuilder中.
下节将看一看BpmnModel是什么.