一、介绍
activiti是使用命令模式设计基于bpmn2.0的一款开源工作流引擎。
工作流简单举例:提交请假申请->经理审批->结束。这就是一个简单流程。activiti支持用户自定义流程。配置各个流程对应审批人,表单等数据,较为灵活。
二、简单流程的实现
原理有兴趣的话可以自己购买书籍,这里先说说实现。
1、引入相关jar包
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-converter</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-model</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-layout</artifactId>
<version>6.0.0</version>
</dependency>
2、自定义bpmn文件
如果使用idea开发,引入相关插件以便自定义bpmn流程文件。
右侧是工作流的各种节点不多做解释,这里只是用了start(开始节点),usertask(任务节点),end(结束节点)。配置了一个两部审批的简单流程。保存下来的bpmn文件实质上是xml文件,另存为xml我们可以看下里面的内容。
实质内容就是process里面的内容,对应的就是流程定义的各个节点,其中usertask节点下extensionElemnts对应的就是内置表单的内容。
3、部署
这里需要简单介绍下activiti几个比较重要的类。
通过ProcessEngineConfiguration可以获取到ProcessEngine(工作流引擎)。activiti几乎所有的工作都是通过这里来实现。
正常的ProcessEngine我们可以通过xml配置获得,这里图个方便,我就使用createStandaloneProcessEngineConfiguration
ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration
. createStandaloneProcessEngineConfiguration();
processEngineConfiguration.setJdbcDriver("org.postgresql.Driver");
processEngineConfiguration.setJdbcUrl("jdbc:postgresql://localhost:5432/comrobot");
processEngineConfiguration.setJdbcUsername("postgres");
processEngineConfiguration.setJdbcPassword("123456");
processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
processEngine = processEngineConfiguration.buildProcessEngine();
通过ProcessEngine可以获得几个类,就是我们比较常用的。
RepositoryService:仓储类,主要用于流程定义以及获取流程定义相关的内容。
HistoryService:历史类,主要用于获取流程历史节点及流程的信息
TaskService:任务类,主要用于流程运转及获取实例节点的信息。
RuntimeService:这个类对应的整个流程,一般用来获取开启工作流及流程的定义
IdentityService:主要是各种验证
FormService:用于各个节点下的表单操作
这里的部署主要用RepositoryService
RepositoryService rep = processEngine.getRepositoryService();
DeploymentBuilder deploymentBuilder = rep.createDeployment();
Deployment deployment = deploymentBuilder.name("zyl_test_2")
.category("请假分类1")
.addClasspathResource("bpm/rest.bpmn")
.deploy();
4、运转
这里就是跑流程了,内容也很简单。
Map<String,Object> variables = new HashMap();//设置流程变量
variables.put("reason","累了,要休息");
variables.put("applyUserId","qwer");
variables.put("applyTitle","test_请假申请流程");
variables.put("applyTime","7天");
variables.put("applyCtreateTime",new Date());
variables.put("applyReason","休假");
variables.put("managerId ","xxx");
variables.put("category ","请假分类——1");
variables.put("user","tom");
variables.put("name","tom");
processEngine.getIdentityService().setAuthenticatedUserId("startuser");
ProcessInstance processInstance = processEngine.getRuntimeService()
.startProcessInstanceById("myProcess_1:1:4",variables);
在流程开始时,可以在startProcessInstanceXXX(XX,XX)方法我们可以放入第二个参数,这里参数是map形式,会以流程变量的形式,绑定在流程实例(ProcessInstance)上。
Map param = new HashMap();
param.put("type",56);
processEngine.getTaskService().complete("5017",param);
processEngine.getTaskService();
上面complete方法就是从一个节点流转到下一个节点,第一个参数对应的当前节点对应的实例ID(taskid),第二个参数是有网关时,流程运转条件。
对于上面的简单例子而言。
startProcess后就会流转firstStep,对应taskid就是5017,这里完成后,就会流转到第二个节点second step对应taskid 5018,这里再一次complate,流程运转就结束了。