工作流Activiti初体验【一】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012138272/article/details/85059493

【写在前面】如果看完这篇博客,对你有帮助的话,欢迎加入全栈技术交流群,群内不定时发布热门学习资料,也欢迎进行技术交流,对我的博客有疑问也可以在群里@我。《全栈技术交流群欢迎你

最近看同事写的工作流bpmn,子流程没有用到多实例,但是神奇的实现了多实例的功能,后来我接手这个项目以后,改了一下bpmn。在设置多实例之前,那神奇的效果消失了…


在这里记录一下我的Activiti历程:(以下示例不涉及真实业务,所有逻辑均建立在学习的基础上)

bpmn图
bpmn

发起任务我设置了一个权限组user1,只要是这个权限的用户都可以发起任务
权限组
分发任务我设置了一个用户组,用户组中每个用户都可以处理这步流程,只要有一个人处理这步任务,分发的流程就算结束了
分发任务
分发任务这一环节还有个判断,允许任务下发和不允许任务下发
判断
任务分发完成则来到子流程,每个被分到任务的人需要执行任务,所以需要派生出多个实例。子流程里面用户集users包含着每一个user
子流程
子流程里面开始的事件需要接收用户参数生产每个实例
执行任务
后面的步骤跟前面差不多,就不细说了


代码部分

配置文件xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
						http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 配置流程引擎配置对象 -->
    <bean id="processEngineConfiguration"
          class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver" />
        <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/activiti?characterEncoding=utf8&amp;useSSL=false&amp;nullCatalogMeansCurrent=true" />
        <property name="jdbcUsername" value="root" />
        <property name="jdbcPassword" value="MySQLadmin1!" />
        <!-- 建表策略:若没有工作流表则创建,若存在工作流表则更新 -->
        <property name="databaseSchemaUpdate" value="true" />
    </bean>

    <!-- 配置一个流程引擎工厂bean,用于创建流程引擎对象 -->
    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
        <!-- 通过set方法注入流程引擎配置对象 -->
        <property name="processEngineConfiguration" ref="processEngineConfiguration" />
    </bean>
</beans>

ActivitiConfig.java

package com.avanty.activiti;

import org.activiti.engine.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ActivitiConfig {

	/**
	 * 配合xml配置文件使用
	 */
	@Bean
	public ProcessEngine processEngine() {
		String resource = "activiti/activitiConfig.xml";
		String beanName = "processEngineConfiguration";
		ProcessEngineConfiguration conf = ProcessEngineConfiguration
				.createProcessEngineConfigurationFromResource(resource, beanName);
		return conf.buildProcessEngine();
	}

	/**
	 * @Bean可以用xml配置,也可以代码配置
	 * @Bean public ProcessEngine processEngine() { //创建Activiti配置对象实例
	 *       ProcessEngineConfiguration configuration =
	 *       ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();
	 *       configuration.setJdbcDriver("com.mysql.cj.jdbc.Driver");
	 *       configuration.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/activiti?characterEncoding=utf8&useSSL=false&nullCatalogMeansCurrent=true");
	 *       configuration.setJdbcUsername("root");
	 *       configuration.setJdbcPassword("MySQLadmin1!"); //设置建表策略
	 *       configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
	 *       //得到引擎实例 return configuration.buildProcessEngine(); }
	 */

	@Bean
	public RepositoryService repositoryService(ProcessEngine processEngine) {
		return processEngine.getRepositoryService();
	}

	@Bean
	public RuntimeService runtimeService(ProcessEngine processEngine) {
		return processEngine.getRuntimeService();
	}

	@Bean
	public TaskService taskService(ProcessEngine processEngine) {
		return processEngine.getTaskService();
	}

	@Bean
	public HistoryService historyService(ProcessEngine processEngine) {
		return processEngine.getHistoryService();
	}

	@Bean
	public ManagementService managementService(ProcessEngine processEngine) {
		return processEngine.getManagementService();
	}

	@Bean
	public IdentityService identityService(ProcessEngine processEngine) {
		return processEngine.getIdentityService();
	}

}

用来测试的DeployActiviti.java

package com.avanty.activiti;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
public class DeployActiviti implements ApplicationRunner {

	/**
	 * 流程部署相关表 `ACT_RE_DEPLOYMENT` `ACT_RE_MODEL` `ACT_GE_BYTEARRAY`
	 * `ACT_GE_PROPERTY` `ACT_RE_PROCDEF`
	 */

	/**
	 * 流程运行相关表 `ACT_RU_EXECUTION` `ACT_RU_IDENTITYLINK` `ACT_RU_JOB` `ACT_RU_TASK`
	 * `ACT_RU_VARIABLE`
	 */

	/**
	 * 流程历史相关表 `ACT_HI_IDENTITYLINK` `ACT_HI_VARINST` `ACT_HI_ACTINST`
	 * `ACT_HI_TASKINST`
	 */

	/**
	 * TaskQuery taskQuery = taskService.createTaskQuery();
	 * taskQuery.taskCandidateGroupIn(roleList);
	 * taskQuery.taskCandidateOrAssigned(usrnames);
	 * taskQuery.includeProcessVariables(); taskList = taskQuery.list();
	 */

	@Autowired
	ProcessEngine processEngine;

	@Autowired
	RuntimeService runtimeService;

	@Autowired
	TaskService taskService;

	@Override
	public void run(ApplicationArguments args) {
		finish();
	}

	private void deployProcess() {
		RepositoryService service = processEngine.getRepositoryService();
		InputStream bpmn = this.getClass().getResourceAsStream("/activiti/Process.bpmn");
		Deployment deployment = service.createDeployment().name("任务流程").addInputStream("Process.bpmn", bpmn).deploy();
		System.out.println(deployment.getName());
		System.out.println(deployment.getId());
	}

	/**
	 * 发起任务
	 */
	private void step1() {
		String processInstanceByKey = "Process";
		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processInstanceByKey);
		System.out.println(processInstance.getId());
	}

	/**
	 * 查看发起任务
	 */
	private void findStep1() {
		TaskQuery taskQuery = taskService.createTaskQuery();
		List<String> roleCodeList = new ArrayList<>();
		roleCodeList.add("user1");
		taskQuery.taskCandidateGroupIn(roleCodeList);
		taskQuery.includeProcessVariables();
		List<Task> tasks = taskQuery.list();
		for (Task task : tasks) {
			System.out.println(task.getId());
			System.out.println(task.getProcessInstanceId());
			System.out.println(task.getName());
			System.out.println(task.getAssignee());
		}
	}

	/**
	 * 分发任务
	 */
	private void step2() {
		TaskQuery taskQuery = taskService.createTaskQuery();
		List<String> roleCodeList = new ArrayList<>();
		roleCodeList.add("user1");
		taskQuery.taskCandidateGroupIn(roleCodeList);
		taskQuery.includeProcessVariables();
		Task task = taskQuery.singleResult();

		Map<String, Object> variables = new HashMap<>();
		List<String> users = new ArrayList<>();
		users.add("Michael");
		users.add("Zhan");
		variables.put("users", users);
		taskService.complete(task.getId(), variables);
		System.out.println("finish");
	}

	/**
	 * 查看分发任务
	 */
	private void findStep2() {
		String assignee = "Zhan";
		// String assignee = "Michael";
		List<Task> tasks1 = taskService.createTaskQuery().taskCandidateUser(assignee).list();
		for (Task task1 : tasks1) {
			System.out.println(task1.getId());
			System.out.println(task1.getName());
		}
	}

	/**
	 * 子流程-执行任务
	 */
	private void step3() {
		TaskQuery taskQuery = taskService.createTaskQuery();
		taskQuery.taskCandidateOrAssigned("Michael");
		taskQuery.includeProcessVariables();
		Task task = taskQuery.singleResult();
		System.out.println(task.getId());
		Map<String, Object> variables = new HashMap<>();
		List<String> users = new ArrayList<>();
		users.add("admin");
		users.add("root");
		variables.put("users", users);
		variables.put("isPass", 1);
		taskService.complete(task.getId(), variables);
		System.out.println("finish");
	}

	/**
	 * 子流程-查看执行任务
	 */
	private void findStep3() {
		 String assignee = "admin";
//		String assignee = "root";
		List<Task> tasks = taskService.createTaskQuery().taskCandidateOrAssigned(assignee).list();
		for (Task task : tasks) {
			System.out.println(task.getId());
			System.out.println(task.getProcessInstanceId());
			System.out.println(task.getName());
		}
	}

	/**
	 * 子流程-验收任务
	 */
	private void step4() {
		String assignee = "admin";
		Task task = taskService.createTaskQuery().taskCandidateOrAssigned(assignee).singleResult();
		System.out.println(task.getId());
		Map<String, Object> variables = new HashMap<>();
		List<String> users = new ArrayList<>();
		if (assignee.equals("root")) {
			users.add("administrator");
			users.add("su");
		}else if(assignee.equals("admin")) {
			users.add("alex");
			users.add("sudo");
		}
		variables.put("users", users);
		taskService.complete(task.getId(), variables);
		System.out.println("finish");
	}

	/**
	 * 子流程-查看验收任务
	 */
	private void findStep4() {
//		 String assignee = "administrator";
//		String assignee = "su";
//		String assignee = "alex";
		String assignee = "sudo";
		List<Task> tasks = taskService.createTaskQuery().taskCandidateOrAssigned(assignee).list();
		for (Task task : tasks) {
			System.out.println(task.getId());
			System.out.println(task.getProcessInstanceId());
			System.out.println(task.getName());
		}
	}

	/**
	 * 子流程-完成
	 */
	private void finish() {
		String assignee = "alex";
		Task task = taskService.createTaskQuery().taskCandidateOrAssigned(assignee).singleResult();
		Map<String, Object> variables = new HashMap<>();
		variables.put("isPass", 1);
		taskService.complete(task.getId(), variables);
		System.out.println("finish");
	}

}


最后,附上项目地址 Activiti-Test
项目是用Eclipse写的,不用IDEA的原因是Eclipse的Activiti插件比IDEA的好,有自动对齐功能,强迫症的福音呐!
好了,如果有什么疑问,可以来群里找我,如果没什么疑问,也可以来群里找我,掰掰~

猜你喜欢

转载自blog.csdn.net/u012138272/article/details/85059493