您的位置:首页 > 其它

Activiti工作流框架学习(二)——使用Activiti提供的API完成流程操作

2017-08-02 14:00 519 查看

可以在项目中加入log4j,将logj4.properties文件拷入到src目录下,这样框架执行的sql就可以输出到到控制台,log4j提供的日志级别有以下几种:

Fatal  error  warn  info  debug  trace

一、部署流程定义

1,在工程项目下创建源码文件夹process

2,在该文件下下面新创建一个工作流流程定义文件test1.bpmn(NewàActivit Diagram)

3,在test1.bpmn文件定义请假流程或者是报销流程

4,测试代码

[java] view
plain copy

public class ActivitiAPI {  

   //首先获得默认的流程引擎,在创建时会自动加载classpath下得activiti.cfg.xml或者是activiti-context.xml  

   ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();  

   /** 

     * 1.部署流程定义 

     * 会在三张表中产生数据: 

      * act_ge_bytearray 产生两条数据 

     *act_re_deployment 产生一条数据 

     *act_re_procdef 产生一条数据 

    * 方式一:读取单个的流程定义文件 

    * 方式二:读取zip压缩文件 

    */  

   @Test  

   public void deploy() {  

      // 获取仓库服务并创建发布配置对象  

      DeploymentBuilder deploymentBuilder = processEngine  

            .getRepositoryService().createDeployment();  

      // 方式一:设置发布信息  

      deploymentBuilder.name("请假流程部署");//添加部署规则的名称  

// 读取单个的流程定义文件  

      deploymentBuilder.addClasspathResource("test1.bpmn");  

// 添加规则图片  不添加会自动产生一个图片不推荐  

      deploymentBuilder.addClasspathResource("test1.png");  

      Deployment  

      deployment =deploymentBuilder.deploy();  

   

      // 方式二:读取zip压缩文件  

      /*ZipInputStream zipInputStream = new ZipInputStream(this.getClass() 

   .getClassLoader().getResourceAsStream("process.zip")); 

      deploymentBuilder.addZipInputStream(zipInputStream); 

      Deployment deployment =deploymentBuilder.deploy();*/  

   }  

   }  

部署流程定义步骤:

  1)     首先获得默认的流程引擎getDefaultProcessEngine(),在创建时会自动加载classpath下得activiti-context.xml或者是activiti.cfg.xml

  2)     通过流程引擎获取了一个RepositoryService对象也就是仓库服务对象

  3)     由仓库的服务对象创建一个部署对象配置对象,用来封装部署环境的相关配置。

  4)     这是一个链式编程,在部署配置对象中设置显示名,上传规则文件相对classpath的地址。

  5)     部署,也是往数据库中存储流程定义的过程。

  6)     这一步在数据库中将操作三张表:

    a)     act_re_deployment

       存放流程定义的显示名和部署时间,每部署一次增加一条记录

    b)     act_re_procdef

       存放流程定义的属性信息,部署每个新的流程定义都会在这张表中增加一条记录。

    c)     act_ge_bytearray

       存储流程定义相关的部署信息。即流程定义文档的存放地。每部署一次就会增加两条记录,一条是关于bpmn规则文件的,一条是图片的(如果部署时只指定了bpmn一个文件,activiti会在部署时解析bpmn文件内容自动生成流程图)。两个文件不是很大,都是以二进制形式存储在数据库中。

二、查询流程定义

[java] view
plain copy

/** 

    * 查询流程定义列表 

    */  

     

@Test  

   public void queryProcessDefinition(){  

      // 流程定义查询对象,用于查询表act_re_procdef,添加条件查询  

      ProcessDefinitionQuery query = processEngine.getRepositoryService()  

            .createProcessDefinitionQuery();  

      // 添加过滤条件  

      query.processDefinitionKey("bxlc");  

      // 添加排序条件降序排序  

      query.orderByProcessDefinitionVersion().desc();  

      // 添加分页查询  

      query.listPage(0, 10);  

      List<ProcessDefinition> list =query.list();  

      for(ProcessDefinition pd : list) {  

System.out.println(pd.getName()+ "" + pd.getId());  

      }  

   }  

流程定义查询步骤:

 1)     因为流程定义的信息存放在仓库中,所以应该获取RepositoryService。

  2)     创建流程定义查询对象,可以在ProcessDefinitionQuery上设置查询过滤参数

  3)     调用ProcessDefinitionQuery对象的list方法,执行查询,获得符合条件的流程定义列表

  4)     由运行结果可以看出:

    a)     Key和Name的值为:bpmn文件process节点的id和name的属性值

    b)     key属性被用来区别不同的流程定义。

    c)     带有特定key的流程定义第一次部署时,version为1。之后每次部署都会在当前最高版本号上加1

 d)     Id的值的生成规则为:{processDefinitionKey}:{processDefinitionVersion}:{generated-id},这里的generated-id是一个自动生成的唯一的数字

    e)     重复部署一次,deploymentId的值以一定的形式变化

三、删除流程定义

[java] view
plain copy

/** 

    * 删除流程定义(通过删除部署信息达到删除流程定义的目的) 

*删除act_re_procdef和act_re_deployment表中的一条记录 

    */  

@Test  

public void delDeployment() throwsException {  

 // 获取仓库服务对象  

 RepositoryService repositoryService =processEngine.getRepositoryService();  

 // 删除发布信息  

 String deploymentId = "1";  

 // 普通删除,如果当前规则下有正在执行的流程,则抛异常  

 repositoryService.deleteDeployment(deploymentId);  

 // 级联删除,会删除和当前规则相关的所有信息,包括历史  

 repositoryService.deleteDeployment(deploymentId, true);  

 }  

四、启动流程实例

什么是流程实例?根据一个流程定义具体的一次执行过程就是一个流程实例,一个流程定义对应多个流程实例(一对多关系),比如:已经定义了一个请假流程,张三同学走了一次该流程这就是启动一次流程实例

[java] view
plain copy

/**根据流程定义的id启动一个流程实例,这个流程定义的Id来自act_re_procdef 

    * 启动一次流程实例act_ru_execution表增加一条数据 

    */  

   @Test  

   public void startProcessInstance() {  

//获取流程定义ID  

      /* 

       *String processDefinitionId = "qjlc:9:1204"; ProcessInstance 

       *processInstance = 

       *processEngine.getRuntimeService().startProcessInstanceById 

       * (processDefinitionId );System.out.println(processInstance.getId()); 

       */  

//自动选择最新版本的流程定义启动流程实例建议使用key来启动  

      String processDefinitionKey = "qjlc";  

      ProcessInstance processInstance = processEngine.getRuntimeService()  

            .startProcessInstanceByKey(processDefinitionKey);  

      System.out.println(processInstance.getId());  

   }  

五、查询流程实例列表

[java] <a target=_blank href="http://blog.csdn.net/xnf1991/article/details/52675396#" class="ViewSource" title="view plain" target="_blank" style=
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐