activiti入门案例

Posted wei-cy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了activiti入门案例相关的知识,希望对你有一定的参考价值。

上一篇我们介绍了activiti的基本概念,这一篇我们来讲述bpmn的构建以及如何部署、定义、完成一套流程。

流程图的绘画与配置

(1)绘画:这个和我们大学的时候,学的流程图有个相同点是,都有一个开始和一个结束。在resources建立diagrams文件夹,并新建个application.bpmn文件,开始的节点就点击start event ,结束的就点击end event,节点任务的话,就选择Task下面的userTask就可以了,连线的话,可以选择connection下面的SequenceFlow或者如下面图所示将鼠标放到节点任务上面,也是有线可以直接连下一个节点任务的。把每个节点用线连上,也就算完成了绘画

 

 技术图片

 

 (2)配置

图虽然画好了,但是核心配置还是要配置的,点击节点任务。可以看到下面的properties里面的General,在这里Id我们可以不改了,name就是你这个节点对应的任务名称,Main config里面可以填写该节点任务的办理人,即谁来完成这个任务。在这里我就委屈下,由张三来完成了,同样的道理,领导审批的节点任务,我安排了李四来完成。

 技术图片技术图片

 

 在配置完所有的节点任务,点击空白处,配置该流程的流程的key,也就是Id以及配上name的值。至此我们的配置也就完成了,最后点击ctrl+s保存后,会发现也生产了png文件。

技术图片

 

 流程的部署

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

public
void deployment(){

        Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service
        .createDeployment()//创建一个部署对象
        .name("application-test")//添加部署的名称
        .addClasspathResource("diagrams/application.bpmn")//从classpath的资源中加载,一次只能加载一个文件
        .addClasspathResource("diagrams/application.png") 
        .addZipInputStream(zipInputStream)
        .deploy();//完成部署

        System.out.println("部署ID:"+deployment.getId());
        System.out.println("部署名称:"+deployment.getName());//test

}

 测试结果

技术图片

启动流程

@Test
public void startProcessInstance(){
    //流程定义的key
    String processDefinitionKey = "testActiviti";
    ProcessInstance pi = processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service
    .startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动流程实例,key对应application.bpmn文件中id的属性值,使用key值启动,默认是按照最新                                  //版本的流程定义启动
    System.out.println("流程实例ID:"+pi.getId());
    System.out.println("流程定义ID:"+pi.getProcessDefinitionId());
}

测试结果

技术图片

 说明:我们可以看到产生的流程id,其实规则就是流程key:版本:随机数  ,这里的版本是当你只要部署并启动流程,那么版本就会+1

 

查询待办任务

经过上面的部署和启动,那么现在应该到了第一个节点环节的办理人张三,下面我们来看看如何查看自己的个人待办信息

@Test
public
void findMyPersonalTask(){ String assignee = "张三"; List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service .createTaskQuery()//创建任务查询对象 .taskAssignee(assignee)//指定个人任务查询,指定办理人 .list();for(Task task:list){ System.out.println("任务ID:"+task.getId()); System.out.println("任务名称:"+task.getName()); System.out.println("任务的办理人:"+task.getAssignee()); System.out.println("流程实例ID:"+task.getProcessInstanceId()); System.out.println("执行对象ID:"+task.getExecutionId()); System.out.println("流程定义ID:"+task.getProcessDefinitionId()); } }

测试结果:由此可见,我们的流程目前为止算是启动成功的,已经到达张三这里了。

技术图片

 

完成任务

到达张三这里之后,那么张三肯定要完成任务了

@Test
public
void completeMyPersonalTask(){ //任务ID String taskId = "2204"; processEngine.getTaskService()//与正在执行的任务管理相关的Service .complete(taskId); System.out.println("完成任务:任务ID:"+taskId); }

测试结果:此时可以看到已经完成了任务,并且通过查看待办任务的方法查询李四时,发现任务已经到达李四这里了。

技术图片技术图片

随后们再让李四执行完成任务,这里就不做演示了。

 

查看流程状态

最后李四完成任务后,我们来看看流程的运行状态,按道理来说,流程应该是已经结束的状态

@Test
    public void processState(){
        ProcessInstance pi=processEngine.getRuntimeService() // 获取运行时Service
            .createProcessInstanceQuery() // 创建流程实例查询
            .processInstanceId("2201") // 用流程实例ID查询
            .singleResult();
        if(pi!=null){
            System.out.println("流程正在执行!");
        }else{
            System.out.println("流程已经执行结束!");
        }
    }

测试结果

技术图片

 

 至此,我们就测试完了一套简单版的流程,从绘图-配置,到流程的部署、启动、完成的一个案例。通过上面的案例我们可以发现,有了工作流,帮助我们减少了不少代码的开发, 通过利用activiti的几个核心api就能帮助我们实现人员的任务办理。

 

以上是关于activiti入门案例的主要内容,如果未能解决你的问题,请参考以下文章

activiti入门案例

activiti入门案例

Activiti6系列- 核心API

Android 事件分发事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )(代码片段

如何在 Activity(非 AppCompatActivity)中打开片段?

片段 MyFragment 未附加到 Activity