activiti源码笔记之deploy

activiti源码笔记之deploy_第1张图片

在真正跑起一个流程之前首先发布流程资源.流程资源包括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栈 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是什么.


你可能感兴趣的:(源码,Activiti)