代码改变世界

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是什么.