专业的编程技术博客社区

网站首页 > 博客文章 正文

分分钟搞懂Activiti工作流并与Springboot整合

baijin 2024-10-18 04:06:48 博客文章 13 ℃ 0 评论

工作很长时间,没有碰到工作流的问题,今天我们来看一下什么是工作流。

一、 什么是工作流

以请假为例,现在大多数公司的请假流程是这样的

员工向上级提出请假申请——上级口头同意——上级将请假记录下来——月底将请假记录上交公司——公司将请假录入电脑

采用工作流技术的公司的请假流程是这样的

员工使用账户登录系统——点击请假——上级登录系统点击允许

就这样,一个请假流程就结束了

有人会问,那上级不用向公司提交请假记录?公司不用将记录录入电脑?答案是,用的。但是这一切的工作都会在上级点击允许后自动运行!

这就是工作流技术。

Georgakopoulos给出的工作流定义是:工作流是将一组任务组织起来以完成某个经营过程:定义了任务的触发顺序和触发条件,每个任务可以由一个或多个软件系统完成,也可以由一个或一组人完成,还可以由一个或多个人与软件系统协作完

二、整合Spring Boot + activiti 一个例子瞬间就懂

我们要完成上图例子。同学提交请假,组长同意后给班长。班长同意后结束。

组长不同意或班长不同意就结束。

步骤:

1、搭建Spring boot 2.0版本(这里不详细介绍了)

2、引入activiti

	<dependency>
 <groupId>org.activiti</groupId>
 <artifactId>activiti-spring</artifactId>
 <version>6.0.0</version>
 </dependency>

3、配置文件

@Configuration

public class ActivitiConfiguration {

@Autowired

private DataSource dataSource;

@Autowired

private PlatformTransactionManager platformTransactionManager;

@Bean

public SpringProcessEngineConfiguration springProcessEngineConfiguration() {

SpringProcessEngineConfiguration spec = new SpringProcessEngineConfiguration();

spec.setDataSource(dataSource);

spec.setTransactionManager(platformTransactionManager);

spec.setDatabaseSchemaUpdate("true");

Resource[] resources = null;

// 启动自动部署流程

try {

resources = new PathMatchingResourcePatternResolver().getResources("classpath*:processes/*.bpmn");

} catch (IOException e) {

e.printStackTrace();

}

spec.setDeploymentResources(resources);

return spec;

}

@Bean

public ProcessEngineFactoryBean processEngine() {

ProcessEngineFactoryBean processEngineFactoryBean = new ProcessEngineFactoryBean();

processEngineFactoryBean.setProcessEngineConfiguration(springProcessEngineConfiguration());

return processEngineFactoryBean;

}

@Bean

public RepositoryService repositoryService() throws Exception {

return processEngine().getObject().getRepositoryService();

}

@Bean

public RuntimeService runtimeService() throws Exception {

return processEngine().getObject().getRuntimeService();

}

@Bean

public TaskService taskService() throws Exception {

return processEngine().getObject().getTaskService();

}

@Bean

public HistoryService historyService() throws Exception {

return processEngine().getObject().getHistoryService();

}

}

4、在resources中创建processes文件夹,并新建文件 MyProcesses.bpmn 绘制流程图。这里需要安装activiti的插件。

5、这里我们只要有该流程图,activiti的引擎就会跟着图上的流程一步一步执行了。灰常的方便。

这里我们增加一个小需求,组长有好几个,我们需要制定哪个组长审批。跟着步骤我们设置一个监听器。

public class AuditorTaksListener implements TaskListener {
	private static final long serialVersionUID = 1L;
	@Override
	public void notify(DelegateTask delegateTask) {
		String[] zuzhang = { "zhangsan", "lisi" };
		delegateTask.addCandidateUsers(Arrays.asList(zuzhang));
	}
}

这里我们制定张三、李四使我们的组长。

6、我们业务的逻辑

  • 开启流程
 	Map<String, Object> variables = new HashMap<String, Object>();
 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myprocess", variables);
 System.out.println("流程已启动"+processInstance.getId());

这里processInstance.getId()需要与我们具体的业务绑定起来。以便拿到任务。

  • 根据流程ID获取当前的任务,并完成“提交审核" 的任务
	Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
		taskService.complete(task.getId(),variables);

此时我们的流程走到了组长审批。还记得我们的监听器吗?触发条件是 create 。

当我们完成“提交审核”的任务时,“组长审批”就会自动创建。创建就会触发我们的监听器。自动进入到了我们的监听器。并制定任务的审核人是张三或者李四。

  • 接下来我们查看李四的任务。
	List<Task> list = taskService.createTaskQuery().taskCandidateUser("lisi").orderByTaskCreateTime().asc().list();

我们就拿到了李四的任务列表。列表中含有列表的ID,获得这个taskId。我们就可以选择完成该任务。

Map<String, Object> variables = new HashMap<String, Object>();
taskService.complete(task.getId(),variables);

但是,李四可以选择同意或是不同意。我们的variables就要增加同不同意的变量

Map<String, Object> variables = new HashMap<String, Object>();

variables.put("options", "true");

taskService.complete(task.getId(),variables);

修改我们的流程图

options为true 就是同意了,完成以后,“班长审批”就会被创建。

在班长审批上加上一个监听器,后面的步骤是不是就跟组长审批一样了呢。

这个工作流就这样完成了,是不是特别简单、有趣呢?

以后我们在慢慢深入去看看这个有趣的小引擎。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表