Activiti工作流(一)之基本操作介绍
工作流的概念:
工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。通俗的说,流程就是多个人在一起合作完成某件事情的步骤,把步骤变成计算机能理解的形式就是工作流。
常见的工作流引擎有:OSWorkFlow、jbpm、activiti(对jbpm的升级)
如果在一个项目中我们需要引入工作流的话,首先需要引入相关jar包,然后获得一个工作流引擎,而获得这个工作流引擎的方式有三种:
1、通过代码方式获得:
@Test public void getProcessEngine1(){ ProcessEngineConfiguration engineConfiguratoin = ProcessEngineConfiguration .createStandaloneProcessEngineConfiguration(); engineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver"); engineConfiguration .setJdbcUrl("jdbc:mysql://10.10.10.30:3306/activitiDB?createDatabaseIfNotExist=true" + "&useUnicode=true&characterEncoding=utf8"); engineConfiguration.setJdbcUsername("root"); engineConfiguration.setJdbcPassword("aaaaaaaaa"); engineConfiguration.setDatabaseSchemaUpdate("true"); ProcessEngine buildProcessEngine = engineConfiguration.buildProcessEngine(); }
2、通过加载指定的xml文件获取
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql://10.10.10.30:3306/activitiDB?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8"></property> <property name="jdbcUsername" value="root"></property> <property name="jdbcPassword" value="aaaaaaaa"></property> <property name="databaseSchemaUpdate" value="true"></property> </bean> </beans>
@Test public void getProcessEngine2(){ ProcessEngineConfiguration engineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml"); ProcessEngine processEngine = engineConfiguration.buildProcessEngine(); }
3、通过加载默认的xml文件获取,默认xml文件名称为activiti.cfg.xml
@Test public void getProcessengine3(){ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); }
当获得了工作流引擎之后,会创建一个数据库,数据库中有默认的23张表
资源库流程规则表 1) act_re_deployment 部署信息表 2) act_re_model 流程设计模型部署表 3) act_re_procdef 流程定义数据表 运行时数据库表 1) act_ru_execution 运行时流程执行实例表 2) act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息 3) act_ru_task 运行时任务节点表 4) act_ru_variable 运行时流程变量数据表 历史数据库表 1) act_hi_actinst 历史节点表 2) act_hi_attachment 历史附件表 3) act_hi_comment 历史意见表 4) act_hi_identitylink 历史流程人员表 5) act_hi_detail 历史详情表,提供历史变量的查询 6) act_hi_procinst 历史流程实例表 7) act_hi_taskinst 历史任务实例表 8) act_hi_varinst 历史变量表 组织机构表 1) act_id_group 用户组信息表 2) act_id_info 用户扩展信息表 3) act_id_membership 用户与用户组对应信息表 4) act_id_user 用户信息表 这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足 通用数据表 1) act_ge_bytearray 二进制数据表 2) act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录 还有两张表不怎么常用 1) act_ru_event_subscr 2) act_ru_job
接下来就是activiti的核心API部分
这些service可以由ProcessEngine获得,且这些service都有着各自的任务
RepositoryService | 管理流程定义 |
RuntimeService | 执行管理,包括启动、推进、删除流程实例等操作 |
TaskService | 任务管理 |
HistoryService | 历史管理(执行完的数据的管理) |
IdentityService | 组织机构管理 |
FormService | 一个可选服务,任务表单管理 |
ManagerService |
接下来是完成一个工作流程的基本操作步骤,首先我们需要安装Activiti插件,然后我们构建一个流程实例并部署上去
@Test public void deploy(){ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService service = processEngine.getRepositoryService(); Deployment deploy = service.createDeployment() .addClasspathResource("diagrams/LeaveProcess.bpmn") .addClasspathResource("diagrams/LeaveProcess.png") .name("请假流程") .deploy(); }
部署流程还有一种方法也可以:加载压缩文件(zip格式)
@Test public void deployProcess2(){ InputStream in = getClass().getClassLoader().getResourceAsStream("Leave.zip"); ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); Deployment deploy = processEngine.getRepositoryService() .createDeployment() .name("请假流程") .addZipInputStream(new ZipInputStream(in)) .deploy(); }
接下来就是启动流程
@Test public void test(){ String instanceKey = "myProcess"; ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RuntimeService service = processEngine.getRuntimeService(); ProcessInstance instance = service.startProcessInstanceByKey(instanceKey); }
在流程启动的过程中,我们可以查询流程的进度
@Test public void query(){ String assignee = "Meixi"; ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); TaskService service = processEngine.getTaskService(); TaskQuery taskQuery = service.createTaskQuery(); List<Task> list = taskQuery.taskAssignee(assignee).list(); for (Task task : list){ System.out.println(task); } }
接下来就是完成每一个流程
@Test public void complete(){ String taskID = "104"; ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); TaskService service = processEngine.getTaskService(); service.complete(taskID); }