`
Asen丶
  • 浏览: 40342 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Activiti工作流(二)之常用操作

 
阅读更多

前面介绍了Activiti工作流的基本操作,但是在实际应用过程中,往往不满足项目需求,因此还需要了解一些其他的功能比如:连线、排他网关、并行网管、流程变量、个人任务及组任务的三种发布方式。

 

 下面将介绍Activiti工作流中的连线操作

首先需要构建一个流程实例并且部署到项目中去

 


 可以看出这个流程实例和之前的有一些区别,就是连线上多了一下文字,要想让流程引擎通过连线来辨别走哪个流程需要在连线上加上对应的条件,比如${message=="不紧急"},然后再在完成任务的时候讲该信息封装到map中并传递给流程引擎

        @Test
	public void compileTask(){
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		
		//任务ID
		String taskID = "302";
		
		//获得任务服务
		TaskService taskService = processEngine.getTaskService();
		
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("message", "不紧急");
		
		taskService.complete(taskID, map);
	}

 这样流程引擎就会将该任务分配给部门主管,通过对连线的设置可以手动的将任务分配给指定的人,但是在实际应用过程中,往往还需要一个默认执行的流程,这时候就需要排他网关

首先构建一个新的流程实例并且部署上去

 

 在排他网关中,我们需要设置一个Default flow,里面填上需要默认执行连线的ID,且其它连线需要设置对应的Condition,在流程任务执行任务的过程中,当检测到没有一条连线符合我们需要执行的流程的条件时,排他网关会默认的将该任务分配给默认的连线,这里有几点需要注意:

1) 决策网关只会返回一条结果。当流程执行到排他网关时,流程引擎会自动检索网关出口,从上到下检索如果发现第一条决策结果为true或者没有设置条件的(默认为成立),则流出。

2) 如果没有任何一个出口符合条件,则抛出异常

3) 使用流程变量,设置连线的条件,并按照连线的条件执行工作流,如果没有条件符合的条件,则以默认的连线离开

 

接下来是并行网关,首先创建流程实例并且部署到项目上

 

 当该流程启动之后,观察数据库中的表的数据

 首先观察ACT_RU_TASK表,这里面是我们需要执行的task



 然后再看ACT_RU_EXECUTION表,这张表很重要,体现了并行网关的功能

 

 接下来我们先完成付款和收款任务,然后再观察这两张表里面的数据



 

 可以看见在ACT_RU_TASK表中已经少了一项数据,但是在ACT_RU_EXECUTION表中数据还没有变,接下来再去完成发货和收获任务,然后再观察着两张表



 

 可以看见这两张表中都已经没有了任何数据,尤其是ACT_RU_EXECUTION表,这张表只有当并行网关中的所有任务都执行完毕之后数据才会消失。

并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略,同时并行网关是不需要平衡的。

 

然后再看流程变量,流程变量相对简单,只需要写两个方法,一个方法设置流程变量,一个方法获取流程变量即可,只需要注意一点,流程变量可以设置和获取一个实体类对象,这里直接贴出代码

        @Test
	public void setVariables(){
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		
		String assigneeUser = "Asen";
		String instanceId = "101";
		
		TaskService taskService = processEngine.getTaskService();
		
		Task task = taskService.createTaskQuery()
		.taskAssignee(assigneeUser)
		.processInstanceId(instanceId)
		.singleResult();
		
		Person person = new Person("Meixi", 30, "Asen3245243", "13090908080");
		
		taskService.setVariable(task.getId(), "取钱人", "Ronaldo");
		taskService.setVariableLocal(task.getId(), "金额", "10000");
		taskService.setVariable(task.getId(), "取钱人信息", person);
		
	}

 

        @Test
	public void getVariables(){
		String assignUser = "Asen";
		String instanceId = "101";
		
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		
		TaskService taskService = processEngine.getTaskService();
		
		Task task = taskService.createTaskQuery()
		.taskAssignee(assignUser)
		.processInstanceId(instanceId)
		.singleResult();
		
		String user = (String) taskService.getVariable(task.getId(), "取钱人");
		String money = (String) taskService.getVariable(task.getId(), "金额");
		Person personMessage = (Person) taskService.getVariable(task.getId(), "取钱人信息");
		
		System.out.println("user:" + user + " money:" + money + " personMessage:" + personMessage);
	}

 最后就是个人任务及组任务的三种分配方式,其中个人任务和组任务的分配方式大同小异,首先是个人任务的分配,第一种就是直接Assign给一个人名(字符串)



 第二种就是封装成一个map传递给流程引擎



 

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	@Test
	public void testTask() throws Exception {
		
		InputStream inputStreamBpmn = this.getClass().getResourceAsStream("taskProcess.bpmn");
		InputStream inputStreamPng = this.getClass().getResourceAsStream("taskProcess.png");
		processEngine.getRepositoryService()//
						.createDeployment()//
						.addInputStream("userTask.bpmn", inputStreamBpmn)//
						.addInputStream("userTask.png", inputStreamPng)//
						.deploy();
		

		Map<String, Object> variables = new HashMap<String, Object>();
		variables.put("userID", "Ronaldo");
		ProcessInstance pi = processEngine.getRuntimeService()
                                           .startProcessInstanceByKey("taskProcess",variables);
	}

 第三种分配方式使用类,这时候不需要指定办理人,直接添加一个类即可



 

 

 此时的bpmn_xml文件内容已经发生变化

<userTask id="usertask1" name="付款" activiti:assignee="Asen">
      <extensionElements>
        <activiti:taskListener event="create" class="com.asen.entity.Person"></activiti:taskListener>
      </extensionElements>
    </userTask>

 最后我们需要手动添加一个类去实现TaskListener接口,并且重写notify方法,在该方法中我们需要去指定个人任务

@Override
	public void notify(DelegateTask delegateTask) {
		String assignee = "Ronaldo";
		//指定个人任务
		delegateTask.setAssignee(assignee);
	}

 然后就可以去查询了

@Test
	public void findMyTaskList(){
		String userId = "Ronaldo";
		List<Task> list = processEngine.getTaskService()//
		                .createTaskQuery()//
		                .taskAssignee(userId)//指定个人任务查询
		                .list();
		for(Task task:list ){
			System.out.println("id="+task.getId());
			System.out.println("name="+task.getName());
			System.out.println("assinee="+task.getAssignee());
			System.out.println("createTime="+task.getCreateTime());
			System.out.println("executionId="+task.getExecutionId());
			
		}
	}

 组任务的三种分配方式就太过详细的写出来了

分配方式一:

 

 分配方式二:



 

//部署流程定义,启动流程实例
	@Test
	public void testTask() throws Exception {
		// 1 发布流程
		InputStream inputStreamBpmn = this.getClass().getResourceAsStream("taskProcess.bpmn");
		InputStream inputStreamPng = this.getClass().getResourceAsStream("taskProcess.png");
		processEngine.getRepositoryService()//
						.createDeployment()//
						.addInputStream("userTask.bpmn", inputStreamBpmn)//
						.addInputStream("userTask.png", inputStreamPng)//
						.deploy();
		// 2 启动流程
		//启动流程实例,同时设置流程变量,用来指定组任务的办理人
		Map<String, Object> variables = new HashMap<String, Object>();
		variables.put("userIDs", "小红,小亮,小明");
		ProcessInstance pi = processEngine.getRuntimeService()//
						.startProcessInstanceByKey("taskProcess",variables);
		System.out.println("pid:" + pi.getId());
	}

 分配方式三:

同样添加一个类,但是实现方法有所区别

public class TaskListenerImpl implements TaskListener {

	/**指定个人任务和组任务的办理人*/
	@Override
	public void notify(DelegateTask delegateTask) {
		String userId1 = "小红";
		String userId2 = "小亮";
		//指定组任务
		delegateTask.addCandidateUser(userId1);
		delegateTask.addCandidateUser(userId2);
	}

}

 

最后补上一些很常用的方法

//可以分配个人任务从一个人到另一个人(认领任务)
	@Test
	public void setAssigneeTask(){
		//任务ID
		String taskId = "3408";
		//指定认领的办理者
		String userId = "Meixi";
		processEngine.getTaskService()//
					.setAssignee(taskId, userId);
	}


//将组任务分配给个人任务(认领任务)
	@Test
	public void claimTask(){
		String taskId = "4008";
		//个人任务的办理人
		String userId = "小明";
		processEngine.getTaskService().claim(taskId, userId);
	}

	//可以分配个人任务回退到组任务,(前提之前是个组任务)
	@Test
	public void setAssigneeTask(){
		//任务ID
		String taskId = "4008";
		processEngine.getTaskService()//
					.setAssignee(taskId, null);
	}
	
	//向组任务中添加成员
	@Test
	public void addUser(){
		String taskId = "4008";
		String userId = "小红";
		processEngine.getTaskService().addCandidateUser(taskId, userId);
	}

	//向组任务中删除成员
	@Test
	public void removeUser(){
		String taskId = "4008";
		String userId = "小亮";
		processEngine.getTaskService().deleteCandidateUser(taskId, userId);
	}

 

  • 大小: 13.7 KB
  • 大小: 74 KB
  • 大小: 8.1 KB
  • 大小: 6.8 KB
  • 大小: 7.2 KB
  • 大小: 7 KB
  • 大小: 7.8 KB
  • 大小: 5 KB
  • 大小: 4.9 KB
  • 大小: 10.1 KB
  • 大小: 29.4 KB
  • 大小: 7.3 KB
  • 大小: 16 KB
  • 大小: 5.9 KB
  • 大小: 33.4 KB
  • 大小: 33 KB
分享到:
评论

相关推荐

    activiti工作流PPT

    **正文** ...总结来说,了解并熟练掌握Activiti的常用API对于任何希望实现高效工作流管理的开发者都至关重要。通过学习这个PPT,你将能够更好地理解和应用Activiti,从而提升你的业务流程自动化能力。

    Activiti工作流整合Web流程设计器整合

    Activiti工作流引擎是一款强大的开源工作流解决方案,它基于模型驱动的架构,旨在为企业提供灵活、可扩展的业务流程自动化能力。在这个“Activiti工作流整合Web流程设计器整合”主题中,我们将深入探讨如何将...

    activiti工作流学习总结

    ### Activiti工作流学习总结 #### 一、Activiti学习资源汇总 - **官方网站**: 提供了Activiti的最新版本信息、文档和技术支持等。地址为:[http://www.activiti.org/](http://www.activiti.org/) - **下载页面**: ...

    Activiti工作流的一些demo,教你快速掌握Activiti工作流在项目中的应用

    Activiti工作流是一款开源的工作流程管理系统,它基于Java平台,为业务流程自动化提供了一套强大的工具。本资源包"ActivitiDemo2"包含了若干个示例,旨在帮助开发者快速理解和运用Activiti在实际项目中的功能。 1. ...

    疯狂工作流讲义 基于Activiti 6.x的应用开发

    《疯狂工作流讲义:基于Activiti 6.x的应用开发》是一本专注于使用Activiti 6.x进行工作流系统构建的专业教程。Activiti是一个开源的工作流引擎,它为业务流程管理(BPM)提供了强大的支持。这本书深入浅出地讲解了...

    activiti基本操作

    Activiti 是一个开源的工作流程引擎,它主要用于设计、...这个"activiti基本操作"的学习资源将帮助初学者快速理解并掌握Activiti的基本用法,通过示例和核心配置文件,可以加深对Activiti工作原理和实际应用的理解。

    springboot-thymeleaf-activiti-master java工作流设计

    三、Activiti工作流引擎 Activiti是一个开源的工作流和业务流程管理(BPM)系统,它提供了流程定义、流程实例执行、任务管理、表单展示、监控等功能。Activiti基于BPMN 2.0标准,支持图形化建模,易于理解和使用,...

    activiti工作流

    Activiti工作流是一款开源的工作流程管理系统,用于设计、部署和执行业务流程。它基于BPMN 2.0标准,提供了强大的流程建模能力,并且与Java和Spring框架深度集成,使得在企业应用中实现工作流程自动化变得简单易行。...

    Activiti入门篇之二 Spring 与Activiti的入门整合

    "Activiti入门篇之二 Spring 与Activiti的入门整合" 这个标题表明我们将会探讨如何在Spring框架中集成Activiti,一个流行的工作流引擎。这通常涉及设置Activiti的依赖,配置Spring上下文,以及如何在Spring环境中...

    Activiti 5.17 入门指南

    #### 1.1 工作流常用词解释 - **工作流(Workflow)**:指组织内的任务按照一定的规则和顺序进行流转的过程,通过工作流管理系统实现自动化。 - **工作流引擎(Workflow Engine)**:是工作流管理系统的核心,负责...

    ssh activiti

    **Activiti工作流引擎** Activiti是一个开源的工作流管理系统,它基于BPMN 2.0标准,支持定义、执行和监控业务流程。在SSH Activiti项目中,Activiti引擎处理流程定义、流程实例的启动、任务分配、流程变量的设置和...

    activiti ssm

    Activiti 是一个开源的工作流和业务流程管理(BPM)引擎,它可以帮助企业构建灵活、可扩展的业务流程应用。SSM 指的是 Spring、Spring MVC 和 MyBatis 这三个流行开源框架的组合,它们是Java Web 开发中的常用技术栈...

    Activiti-APP最全汉化包

    Activiti-APP是Activiti工作流引擎的一个组成部分,它提供了用户友好的图形化界面,用于设计、执行和管理业务流程。用户可以通过这个APP来创建流程模型,定义任务流转规则,监控流程实例的状态,并进行相关的操作,...

    Activiti 5.16 中文手册

    手册会详细解释这些服务及其常用方法,帮助你有效地编程操作工作流。 流程的设计和管理也是重点。Activiti提供了模型er,允许你通过拖拽的方式设计流程图,然后导出为XML文件。此外,你还可以学习如何监控和调试...

    Eclipse Activiti jar包

    Eclipse Activiti 是一个开源的工作流引擎,它允许开发者在Java应用程序中集成业务流程管理(BPM)。这个jar包包含了两个关键组件:`org.activiti.designer.libs-5.18.0.jar` 和 `org.activiti.designer.kickstart....

    工作流演示内容 工作流设计

    这样的文件通常是一个交互式应用,展示了工作流系统的实际操作和功能,用户可以通过模拟来了解如何创建、启动和管理工作流实例。 7. **优化和改进**:工作流设计并非一成不变,随着业务需求的变化和用户反馈,系统...

    ssh2整合activiti5.1.3所需要jar包整合

    SSH2是一种网络协议,用于安全地远程登录到服务器,执行命令,传输文件等操作,而Activiti则是一个开源的工作流引擎,常用于企业级应用中的业务流程自动化。 标题提到的"ssh2整合activiti5.1.3所需要jar包整合",...

    springboot-activiti-test-master.zip

    《SpringBoot整合Activiti工作流实战详解》 在IT行业中,流程管理是企业信息系统不可或缺的一部分。Activiti是一款开源的工作流引擎,它具有强大的流程建模、执行和监控能力。而SpringBoot作为Java生态中的轻量级...

    整合Activiti 5.22 工具包

    Activiti是一款开源的工作流和业务流程管理(BPM)系统,适用于企业的业务流程自动化。它提供了强大的流程定义、执行和监控能力,支持复杂的业务逻辑,并且易于集成到现有的Java应用程序中。在本工具包中,我们专注...

    springboot 2.0.3+activiti 5.22 设计器整合

    在本项目中,我们关注的是将SpringBoot 2.0.3与Activiti 5.22集成,并结合MySQL数据库实现一个高效的工作流系统。这个系统不仅提供了创建、删除流程模型的功能,还支持查看待办、已办事项,以及进行流程跟踪、任务...

Global site tag (gtag.js) - Google Analytics