activiti源码笔记之deploy
2013-12-07 13:34 尔 阅读(815) 评论(0) 收藏 举报
在真正跑起一个流程之前首先发布流程资源.流程资源包括bpmn20.xml、规则文件(drools中)、流程图等等.
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栈、ExecutionContexty栈和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是什么.