1.介绍
1.1 Spring Boot
Spring Boot基于Spring和“习惯由于配置”原则,实现快速搭建项目的准生产框架。建议现在的Java从业者快速迁移到以Spring Boot为基础开发,这将大大降低开发的难度和极大的提高开发效率。
1.2 Activiti
在做企业级应用开发的时候,为了避免流程和业务的耦合,我们经常会引入工作流来解决业务中所遇到的审批相关的操作。
Activiti是一个轻量级的工作流和业务流程管理平台,它的核心是一个超快的BPMN2引擎。
1.3 spring-boot-starters
Spring Boot基于“习惯优于配置”的原则,为大量第三方的库提供自动配置的功能。由Spring专家Josh Long主导开发的spring-boot-starters为我们在Spring Boot下使用Activiti做了自动配置。
其中主要自动配置包括:
* 自动创建Activiti ProcessEngine的Bean;
* 所有的Activiti Service都自动注册为Spring的Bean;
* 创建一个Spring Job Executor;
* 自动扫描并部署位于src/main/resources/processes目录下的流程处理文件。
2.实战
2.1 流程设计
Activi为我们提供了一个基于eclipse的流程设计器,安装地址为:http://activiti.org/designer/update/
新建Activi项目或流程
我们当前模拟一个简单的工作流程,某人想加入某个公司,然后有权限审批的人审批,审批同意后将此人加入组织并输出“加入组织成功”,不同意输出“加入组织失败”。
设计的流程图如下:
流程源码如下:
- <processid="joinProcess"name="Join process"isExecutable="true">
- <startEventid="startevent1"name="Start">
- <extensionElements>
- <activiti:formPropertyid="personId"name="person id"
- type="long"required="true"></activiti:formProperty>
- <activiti:formPropertyid="compId"name="company Id"
- type="long"required="true"></activiti:formProperty>
- </extensionElements>
- </startEvent>
- <endEventid="endevent1"name="End"></endEvent>
- <userTaskid="ApprovalTask"name="Approval Task"
- activiti:candidateUsers="${joinService.findUsers(execution)}"isForCompensation="true">
- <extensionElements>
- <activiti:formPropertyid="joinApproved"name="Join Approved"
- type="enum">
- <activiti:valueid="true"name="Approve"></activiti:value>
- <activiti:valueid="false"name="Reject"></activiti:value>
- </activiti:formProperty>
- </extensionElements>
- </userTask>
- <sequenceFlowid="flow1"sourceRef="startevent1"targetRef="ApprovalTask"></sequenceFlow>
- <serviceTaskid="AutoTask"name="Auto Task"
- activiti:expression="${joinService.joinGroup(execution)}"></serviceTask>
- <sequenceFlowid="flow2"sourceRef="ApprovalTask"targetRef="AutoTask"></sequenceFlow>
- <sequenceFlowid="flow3"sourceRef="AutoTask"targetRef="endevent1"></sequenceFlow>
- </process>
流程解释:
流程最左边是开始,最右边结束,左二小人图标为用户任务(User Task)需要人参与操作,我们选择有权限的操作的人来源于Spring的bean方法activiti:candidateUsers=”${joinService.findUsers(execution)}”,左三齿轮图标为服务任务(Service Task),是自动执行的任务,自动调用Spring的bean方法。
2.2 项目搭建
pom.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.wisely</groupId>
- <artifactId>activiti</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>jar</packaging>
- <name>activiti</name>
- <description>Demo project for Spring Boot</description>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>1.3.0.RELEASE</version>
- <relativePath/><!-- lookup parent from repository -->
- </parent>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <java.version>1.8</java.version>
- <activiti.version>5.19.0</activiti.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-jpa</artifactId>
- </dependency>
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- </dependency>
- <dependency>
- <groupId>org.activiti</groupId>
- <artifactId>activiti-spring-boot-starter-basic</artifactId>
- <version>${activiti.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
- </project>
application.properties配置
- spring.jpa.hibernate.ddl-auto=update
- spring.jpa.database=MYSQL
- spring.datasource.url=jdbc:mysql://192.168.1.68:3306/activiti-spring-boot?characterEncoding=UTF-8
- spring.datasource.username=root
- spring.datasource.password=密码
- spring.datasource.driver-class-name=com.mysql.jdbc.Driver
2.3 核心代码
实体类
- @Entity
- publicclass Person {
- @Id
- @GeneratedValue
- private Long personId;
- privateString personName;
- @ManyToOne(targetEntity = Comp.class)
- private Comp comp;
- publicPerson(){
- }
- publicPerson(String personName){
- super();
- this.personName = personName;
- }
- //省略getter、setter方法
- }
- @Entity
- publicclass Comp {
- @Id
- @GeneratedValue
- private Long compId;
- privateString compName;
- @OneToMany(mappedBy = "comp",targetEntity = Person.class)
- private List<Person> people;
- publicComp(String compName){
- this.compName = compName;
- }
- publicComp(){
- }
- //省略getter、setter方法
- }
DAO
- publicinterface PersonRepository extends JpaRepository<Person, Long> {
- public Person findByPersonName(String personName);
- }
- publicinterface CompRepository extends JpaRepository<Comp, Long>{
- }
Activiti服务
- @Service
- @Transactional
- publicclass ActivitiService {
- //注入为我们自动配置好的服务
- @Autowired
- private RuntimeService runtimeService;
- @Autowired
- private TaskService taskService;
- //开始流程,传入申请者的id以及公司的id
- publicvoidstartProcess( Long personId, Long compId){
- Map<String, Object> variables = new HashMap<String, Object>();
- variables.put("personId", personId);
- variables.put("compId", compId);
- runtimeService.startProcessInstanceByKey("joinProcess", variables);
- }
- //获得某个人的任务别表
- public List<Task> getTasks(String assignee){
- return taskService.createTaskQuery().taskCandidateUser(assignee).list();
- }
- //完成任务
- publicvoidcompleteTasks(Boolean joinApproved, String taskId){
- Map<String, Object> taskVariables = new HashMap<String, Object>();
- taskVariables.put("joinApproved", joinApproved);
- taskService.complete(taskId, taskVariables);
- }
- }
Service Task服务
- @Service
- publicclass JoinService {
- @Autowired
- PersonRepository personRepository;
- @Autowired
- private CompRepository compRepository;
- //加入公司操作,可从DelegateExecution获取流程中的变量
- publicvoidjoinGroup(DelegateExecution execution){
- Boolean bool = (Boolean) execution.getVariable("joinApproved");
- if(bool){
- Long personId = (Long) execution.getVariable("personId");
- Long compId = (Long) execution.getVariable("compId");
- Comp comp = compRepository.findOne(compId);
- Person person = personRepository.findOne(personId);
- person.setComp(comp);
- personRepository.save(person);
- System.out.println("加入组织成功");
- }else{
- System.out.println("加入组织失败");
- }
- }
- //获取符合条件的审批人,演示这里写死,使用应用使用实际代码
- public List<String> findUsers(DelegateExecution execution){
- return Arrays.asList("admin","wtr");
- }
- }
控制器
- @RestController
- publicclass MyRestController {
- @Autowired
- private ActivitiService myService;
- //开启流程实例
- @RequestMapping(value="/process/{personId}/{compId}", method= RequestMethod.GET)
- publicvoidstartProcessInstance(@PathVariable Long personId,@PathVariable Long compId){
- myService.startProcess(personId,compId);
- }
- //获取当前人的任务
- @RequestMapping(value="/tasks", method= RequestMethod.GET)
- public List<TaskRepresentation> getTasks(@RequestParamString assignee){
- List<Task> tasks = myService.getTasks(assignee);
- List<TaskRepresentation> dtos = new ArrayList<TaskRepresentation>();
- for(Task task : tasks){
- dtos.add(newTaskRepresentation(task.getId(), task.getName()));
- }
- return dtos;
- }
- //完成任务
- @RequestMapping(value="/complete/{joinApproved}/{taskId}", method= RequestMethod.GET)
- publicStringcomplete(@PathVariable Boolean joinApproved,@PathVariableString taskId){
- myService.completeTasks(joinApproved,taskId);
- return"ok";
- }
- //Task的dto
- staticclass TaskRepresentation {
- privateString id;
- privateString name;
- publicTaskRepresentation(String id, String name){
- this.id = id;
- this.name = name;
- }
- publicStringgetId(){
- return id;
- }
- publicvoidsetId(String id){
- this.id = id;
- }
- publicStringgetName(){
- return name;
- }
- publicvoidsetName(String name){
- this.name = name;
- }
- }
- }
入口类
- @SpringBootApplication
- publicclass ActivitiApplication {
- @Autowired
- private PersonRepository personRepository;
- @Autowired
- private CompRepository compRepository;
- publicstaticvoidmain(String[] args){
- SpringApplication.run(ActivitiApplication.class, args);
- }
- //初始化模拟数据
- @Bean
- public CommandLineRunner init(final ActivitiService myService){
- returnnewCommandLineRunner(){
- publicvoidrun(String... strings)throws Exception {
- if(personRepository.findAll().size() == 0){
- personRepository.save(newPerson("wtr"));
- personRepository.save(newPerson("wyf"));
- personRepository.save(newPerson("admin"));
- }
- if(compRepository.findAll().size() == 0){
- Comp group = newComp("great company");
- compRepository.save(group);
- Person admin = personRepository.findByPersonName("admin");
- Person wtr = personRepository.findByPersonName("wtr");
- admin.setComp(group);wtr.setComp(group);
- personRepository.save(admin);personRepository.save(wtr);
- }
- }
- };
- }
- }
2.4 演示
启动程序会自动初始化Activiti所用的数据库和我们的业务数据库,并自动发布我们的流程。
此时我们要加入的公司id为1,申请加入的人的id为2,使用PostMan访问http://localhost:8080/process/2/1 此时数据库发生如下变化
此时用户admin和wtr具备审批申请的权利,此时我们访问http://localhost:8080/tasks?assignee=admin 查看admin用户的任务,返回结果为:
- [
- {
- "id":"10",
- "name":"Approval Task"
- }
- ]
我们现在通过访问http://localhost:8080/complete/true/10 完成任务,true为同意(可以选择false),10为task的id,任务完成后会自动调用Service Task,此时wyf这条记录的comp_compId为更新为当前公司的id。
若代码不方便阅读,请查看http://www.microinsight.cn/2015/11/24/spring-boot-activiti/
新书推荐《JavaEE开发的颠覆者: Spring Boot实战》,涵盖Spring 4.x、Spring MVC 4.x、Spring Boot企业开发实战。
京东地址:http://item.jd.com/11894632.html
当当地址:http://product.dangdang.com/23926195.html
亚马逊地址:http://www.amazon.cn/图书/dp/B01D5ZBFUK/ref=zg_bsnr_663834051_6
淘宝地址:https://item.taobao.com/item.htm?id=528426235744&ns=1&abbucket=8#detail
或自己在京东、淘宝、亚马逊、当当、互动出版社搜索自选。
相关推荐
《Spring Boot 2.1.1.RELEASE 集成 Activiti 6 实战编程》是一本深入探讨如何在Spring Boot环境下与Activiti工作流引擎整合的教程。Activiti是企业级的开源工作流和业务流程管理(BPM)系统,它提供了强大的流程建模...
小编 做的这个项目有部分功能用到了 Activiti工作流,目前对工作流的掌握程度是基本会用,我之前写过一篇 Activiti 入门篇,当前这篇文章是属于Activiti 实战部分,如果你想知道Activiti 工作流是如何使用的话,那就...
《Spring Boot集成Activiti实战详解》 在现代企业级应用开发中,流程管理扮演着至关重要的角色。Activiti是一款开源的工作流和业务流程管理引擎,它具有轻量、灵活、强大的特性,被广泛应用于各种业务流程自动化...
4. **Spring Boot 集成**:“spring-boot-activiti-example-master”这个项目名称表明它是使用 Spring Boot 框架来集成 Activiti 的。Spring Boot 是一个快速开发框架,可以简化 Spring 应用的初始搭建以及开发过程...
在本项目中,我们主要探讨的是如何将Java与Spring Boot框架相结合,利用JWT(JSON Web Token)和Spring Security来构建一个安全的Web应用程序。这个实战项目涵盖了从基础概念到实际应用的完整流程,旨在帮助开发者...
《Activiti与Spring Boot整合深度解析》 在现代企业级应用开发中,流程管理成为不可或缺的一部分,Activiti作为一款强大的工作流引擎,被广泛应用在业务流程自动化领域。结合Spring Boot的便捷特性,我们可以轻松...
5. **集成能力**:Activiti 可以与各种数据库系统无缝集成,同时也支持与其他系统如EJB、JMS和Web服务的交互。 6. **社区活跃**:由于其开源性质,Activiti拥有活跃的社区,提供了丰富的文档、示例和插件,为开发者...
在本教程中,你将学习如何配置和使用Activiti7,包括安装、部署以及与Spring Boot的集成。 接下来,我们将探讨Java在工作流开发中的作用。Java作为企业级应用的首选语言,提供了丰富的库和工具支持复杂业务逻辑的...
**SpringBoot集成Activiti实战详解** 在现代企业级应用开发中,流程管理是不可或缺的一部分,而Activiti作为一款开源的工作流引擎,深受开发者喜爱。本文将深入探讨如何将Activiti与SpringBoot进行集成,实现一个...
**SpringBoot集成Activiti实战详解** 在现代企业级应用开发中,流程管理是不可或缺的一部分,而Activiti作为一款流行的开源工作流引擎,被广泛用于实现业务流程自动化。本案例将探讨如何将Activiti与SpringBoot相...
9. **集成应用**:介绍如何将Activiti嵌入到Spring、Spring Boot等框架中,以及与外部系统如数据库、消息队列的集成。 10. **源代码分析**:书中提供的源代码可以辅助读者深入理解Activiti的实现原理,包括流程实例...
将Activiti集成到你的Java项目中,如Spring Boot应用,实现业务流程自动化。 五、进阶学习 5.1 工作流优化 研究如何通过调整流程设计、事件处理和任务分配来优化工作流程。 5.2 Activiti与微服务 了解在微服务...
在本教程中,你将学习如何使用 Java 或者 Spring Boot 创建 Activiti 应用,部署流程定义,启动流程实例,以及处理任务。你还将了解到如何编写自定义的服务任务,以及如何与数据库或其他系统进行交互。 通过这个...
Activiti7可轻松集成到Spring框架,支持RESTful API,方便与其他系统交互。同时,它还可以与Elasticsearch、Zookeeper等技术结合,实现日志分析和集群管理。 9. 监控与调试: 提供了强大的监控工具,如Actuator,...
- **工作流集成**:将Activiti与Spring Boot、Spring Cloud等框架结合,构建微服务架构下的流程管理系统。 5. **最佳实践与注意事项** - **版本控制**:对流程模型进行版本管理,确保升级和回滚的可行性。 - **...
6. **集成实践**:如何将Activiti与现有的业务系统(如Spring Boot、MyBatis等)集成,创建和部署流程定义(.bpmn文件),并在应用中启动流程实例。 7. **事件监听**:可能涉及到使用Activiti的事件监听机制,当...
首先,我们来看"springboot-activitiDemo-master.zip"这个压缩包,它包含了实现SpringBoot与Activiti集成的基础代码和配置。解压后,我们可以看到两个主要的文件:a.txt和activitiDemo。a.txt可能是项目说明或初始化...
3. **Dubbo的配置与集成**:学习如何在Spring Boot项目中引入Dubbo,配置服务提供者和服务消费者,理解Zookeeper或Nacos等服务注册中心的使用。 4. **Dubbo接口定义与实现**:掌握如何定义服务接口,编写服务实现,...
1. **实战项目**:可能会介绍如何将Activiti集成到实际项目中,如Spring Boot或Spring MVC环境下的整合。 2. **服务调用**:演示如何在流程中调用外部服务,如Web服务或数据库操作。 3. **工作流审批**:模拟企业...
Jeecg-Boot是一款基于代码生成器的Java快速开发平台,它集成了Spring Boot、MyBatis Plus、Vue.js等热门技术,旨在提高开发效率,降低开发成本。本文将从核心概念、主要功能、技术栈以及实战应用等方面对Jeecg-Boot...