问题产生背景:
最近在进行项目框架搭建,有个需求:需要在系统中加入工作流的概念,也就是基于角色的审批流,我第一个想到的就是使用框架,而不是进行对于一个请求去设置审批角色。那针对审批流的应用框架成熟的有jBpm、Activiti,基于快捷上手的原因便选择Activiti(有中文API),下面就根据Activiti的使用提供一些技巧。
Activiti介绍
1.什么是Activiti?
简单来说,activit就是业务流程管理框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。通过绘画业务流程图进行业务执行。比较好的作图工具只需要百度就可在线作图。
2.Activiti可以做什么?
Activiti提供一套完整的API,针对企业中的各种审核流程进行规范化处理,简单来说,比如你工作的时候需要请假你得提交请假申请,然后需要各种上级领导审批通过后,你才被批准请假。Activiti就是干这事的,特点就是简单易于维护,也提供了全面API供开发人员查阅,所以用它。
注:本文使用的版本是5.22.0,官网维护版本之一,据说出了6.0更好用,有需要的同学可以去学下然后留言分享
3.简单使用
话不多说,话不投机说不完;码来:
1.常规操作,引入maven包依赖:
流程引擎
<dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>${activiti.version}</version> </dependency> 整合Spring方便扫描配置文件 注:actviti6.0会和mybatis3.4.0以下版本不兼容,注意慎用。 <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring</artifactId> <version>${activiti.version}</version> </dependency> bpmn文件包 <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-bpmn-model</artifactId> <version>${activiti.version}</version> </dependency>
2.本文是springboot2.0玩的,所以配置都写在类里,下面是主配置类的介绍
ActivitiConfig配置类
依赖数据源和事务管理器,因为Activiti是自动建表所以要通过spring注解引入这两个的引用
private DataSource dataSource; private PlatformTransactionManager platformTransactionManager; @Autowired public ActivitiConfig(DataSource dataSource, PlatformTransactionManager platformTransactionManager) { this.dataSource = dataSource; this.platformTransactionManager = platformTransactionManager; }
创建配置文件,也就是提供一些配置信息,这样就可以自定义自己的创建信息了 需要一些参数,1. 数据源。2. 事务管理器。 流程引擎配置对象(配置数据库连接信息和建表策略) 这里还加入了自动扫描process包下的bpmn(流程定义文件)的设置,这样就可以省去了部署 后面会加入部署的功能,将bpmn文件通过zip包形式上传并部署
@Bean public SpringProcessEngineConfiguration springProcessEngineConfiguration(){ SpringProcessEngineConfiguration spec = new SpringProcessEngineConfiguration(); spec.setDataSource(dataSource); spec.setTransactionManager(platformTransactionManager); spec.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); spec.setJobExecutorActivate(false); spec.setActivityFontName("宋体"); spec.setLabelFontName("宋体"); Resource[] resources = null; // 启动自动部署流程 try { resources = new PathMatchingResourcePatternResolver().getResources("classpath*:process/*.bpmn"); } catch (IOException e) { logger.error("加载工作流配置文件失败:{}",e); } spec.setDeploymentResources(resources); return spec; }
注入流程引擎到IOC容器,方便后面引入流程引擎的引用。
processEngine:流程引擎的核心对象(检查环境是否正确,管理各种服务),就是一个业务流程图BPMN文件绘画好后,通过流程引擎工厂类加载到流程引擎容器中,相比spring工厂一样。然后通过runtimeService启动器启动流程引擎:
@Bean public ProcessEngineFactoryBean processEngine() { ProcessEngineFactoryBean processEngineFactoryBean = new ProcessEngineFactoryBean(); processEngineFactoryBean.setProcessEngineConfiguration(springProcessEngineConfiguration()); return processEngineFactoryBean; }
接下来就是引入Activiti提供的常用类方便我们管理流程(比如查看流程图,审核请求等等),下面介绍下好几个常用类、
仓库服务对象(管理部署信息) @Bean(name = "repositoryService") public RepositoryService repositoryService() throws Exception { return processEngine().getObject().getRepositoryService(); } 运行时服务对象(管理流程的启动,流转等操作) @Bean(name = "runtimeService") public RuntimeService runtimeService() throws Exception { return processEngine().getObject().getRuntimeService(); } 任务服务对象(Task表中的数据是Exeuction表的扩展,任务的创建时间和办理人) @Bean(name = "taskService") public TaskService taskService() throws Exception { return processEngine().getObject().getTaskService(); } 任务历史审批服务对象(查看历史审批列表) @Bean(name = "historyService") public HistoryService historyService() throws Exception { return processEngine().getObject().getHistoryService(); } 用户与用户组关系服务对象(Activiti有自己的用户角色表,需要使用这个对象进行管理) @Bean(name = "identityService") public IdentityService identityService()throws Exception{ return processEngine().getObject().getIdentityService(); }
4.开发流程
流程部署信息管理:
1.发布流程
2.查看流程定义 ProcessDefinitionQuery
3.删除流程
4.查看流程附件
流程执行管理:
1.启动流程
2.查看任务(私有/公有)
3.认领Claim UserId 和 TaskId
4.办理任务 complete(taskId)
5.查看任务状态
5.总结
Activiti是一个很容易上手的工作流框架,对于java出身的程序员来讲,不管是api还是文档相对还是很友好的,而且使用起来也很方便。其实Activiti最主要的几个服务对象就是 repositoryService·、runtimeService、taskService、historyService、identiryService。其中最主要的还是taskService。下一篇博文的话,使用Activiti开发一个简单的流程Demo.