activiti6.0学习笔记(一):核心api之RepostoryService

一、前言

     最近因为工作需要,需要搭建工作流平台。经过研究后觉得使用activiti6.0作为平台搭建技术。现将学习过程记录下来,此处不记录整合activiti的过程。整合过程另开博客记录。

二、环境准备

     笔者环境为:

     jdk 1.8

     idea 2018.1.1

     springboot  2.0.5.RELEASE

三、核心api之RepostoryService

   1、创建流程文件TestProcess.bpmn

  可以使用图形化界面创建,如图:

创建以后将后缀改为xml,如testProcess.bpmn20.xml

 修改后的xml文件内容为:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:tns="http://www.activiti.org/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1538297113127" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema">

  <process id="myProcess" isClosed="false" isExecutable="true" name="测试流程" processType="None">

    <startEvent id="startevent1" name="Start"/>

    <endEvent id="endevent1" name="End"/>

    <userTask activiti:assignee="张三" activiti:exclusive="true" id="test" name="用户"/>

    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="test"/>

    <sequenceFlow id="flow2" sourceRef="test" targetRef="endevent1"/>

  <bpmndi:BPMNDiagram documentation="background=#3C3F41;count=1;horizontalcount=1;orientation=0;width=842.4;height=1195.2;imageableWidth=832.4;imageableHeight=1185.2;imageableX=5.0;imageableY=5.0" id="Diagram-_1" name="New Diagram">

//此处省略

</bpmndi:BPMNDiagram>

</definitions>

2、测试代码 如下

/**

*

*  测试RepostoryService

*  RepostoryService操作对象:

*    1、部署文件构造器  DeploymentBuilder

*    2、部署文件查询器  DeploymentQuery

*    3、流程定义文件查询对象  ProcessDefinitionQuery

*    4、流程部署文件对象 Deployment

*    5、流程定义文件对象 ProcessDefinition

*    6、流程定义的java格式 BpmnModel

*

*

* @author chaoge

* @since 2018/9/29 17:22

*/

public class RepositoryServiceTest {

private static final LoggerLOGGER = LoggerFactory.getLogger(RepositoryServiceTest.class);

    @Rule

    public ActivitiRulerule =new ActivitiRule();//默认资源配置文件activiti.cfg.xml

    /**

    * 测试流程部署

    */

    @Test

    public void testRepostoryService() {

RepositoryService repositoryService =rule.getRepositoryService();

        DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();//创建部署流程的builder

        Deployment deployment = deploymentBuilder.name("测试部署资源")

.addClasspathResource("processes/TestProcess.bpmn").deploy();

        LOGGER.info("deployment = {}", deployment);

        //使用repositoryService获取流程部署的query对象,根据这个对象可以获取流程部署信息

        DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();

        Deployment deployment1 = deploymentQuery.deploymentId(deployment.getId()).singleResult();

        LOGGER.info("deployment1 = {}", deployment1);

        LOGGER.info("deployment = deployment1? {}", deployment1.equals(deployment));//结果居然是false

        //输出后两个deployment居然不等,为false  debug后发现 deployment下的deploymentTime中fastTime属性不一样

        List deployments = deploymentQuery.orderByDeploymenTime().asc().listPage(1, 100);

        deployments.forEach(deployment2 -> {

LOGGER.info("deployment1 = {}", deployment2);

            //级联删除流程

            //repositoryService.deleteDeployment(a.getId(),true);

        });

        //上面使用了lambda表达式,该方法等同于下面的使用for循环,后面的一样,此处说明方便不会使用lambda的人,会的人直接忽略

//        for (Deployment deployment2:deployments){

//            LOGGER.info("deployment1 = {}", deployment2);

//        }

        //使用repositoryService查找流程定义的query对象根据这个对象可以获取流程定义信息

        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();

        List processDefinitions = processDefinitionQuery.listPage(1, 100);

        processDefinitions.forEach(

a ->LOGGER.info("processDefinition:{};version:{},key:{};name:{};id:{}"

                        , a, a.getVersion(), a.getKey(), a.getName(), a.getId())

);

    }

/**

    * 测试流程定义挂起和激活

    */

    @Test

    @org.activiti.engine.test.Deployment(resources ="processes/TestProcess.bpmn")//activiti自动部署

    public void testSuspend() {

RepositoryService repositoryService =rule.getRepositoryService();

        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().singleResult();

        LOGGER.info("processDefinition.id = {}", processDefinition.getId());

        System.out.println("processDefinition.id = " + processDefinition.getId());

        //将流程挂起-暂停

        //如果已经挂起,则会报错

        // org.activiti.engine.ActivitiException:

// Cannot set suspension state 'suspended' for

// ProcessDefinitionEntity[exclusiveGatewayAndTimerBoundaryEventProcess:2:2504]':

// already in state 'suspended'.

        repositoryService.suspendProcessDefinitionById(processDefinition.getId());

        LOGGER.info("启动流程,但是因为流程已经被挂起,所以此时就会报错  启动的流程id={}", processDefinition.getId());

        System.out.println("启动流程,但是因为流程已经被挂起,所以此时就会报错");

        //报错信息为org.activiti.engine.ActivitiException:

        // Cannot start process instance. Process definition 排他网关和定时边界任务流程

        // (id = exclusiveGatewayAndTimerBoundaryEventProcess:2:2504) is suspended

        //启动流程

        startProcessInstanceById(processDefinition);

        //激活流程定义

        repositoryService.activateProcessDefinitionById(processDefinition.getId());

        startProcessInstanceById(processDefinition);

        //删除流程

        //repositoryService.deleteDeployment(processDefinition.getId(),true);

    }

/**

    * 测试用户和用户组

    */

    @Test

    @org.activiti.engine.test.Deployment(resources ="processes/second_approve.bpmn")//activiti自动部署

    public void testCandidateStart() {

RepositoryService repositoryService =rule.getRepositoryService();

        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().singleResult();

        LOGGER.info("processDefinition.id = {}", processDefinition.getId());

        System.out.println("processDefinition.id = " + processDefinition.getId());

        //添加启动用户,对应流程文件中启动人的Candidate User属性,多个用户以“,”相隔

        repositoryService.addCandidateStarterUser(processDefinition.getId(),"use1");

        repositoryService.addCandidateStarterGroup(processDefinition.getId(),"groupM");//启动用户组

        List identityLinks = repositoryService.getIdentityLinksForProcessDefinition(processDefinition.getId());

        identityLinks.forEach(identityLink ->LOGGER.info("identityLink: {}",identityLink));

        //删除启动用户及用户组

        repositoryService.deleteCandidateStarterUser(processDefinition.getId(),"use1");

        repositoryService.deleteCandidateStarterGroup(processDefinition.getId(),"groupM");

    }

private void startProcessInstanceById(ProcessDefinition processDefinition) {

try {

System.out.println("开始启动流程");

            rule.getRuntimeService().startProcessInstanceById(processDefinition.getId());

            System.out.println("流程已启动");

        }catch (Exception e) {

System.out.println("流程启动失败");

            LOGGER.info("流程启动失败");

            LOGGER.info(e.getMessage(), e);

        }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容