自学了一段时间的activiti,发现网上有很多的demo都用不起。找了很多,都比较失望。所以今天自己写一个简单的基于springboot的activiti项目。
ok,开始
首先,我们需要先创建一个springboot项目。下面这个pom依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>24.0-jre</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
这里注意一下 ,mysql的依赖包不应版本太高,否则无法自动建表。
然后在启动类上面加上这句话
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
接下来创建我们自己的流程文件,
在resource下面创建一个文件夹来存放对应的文件,当然这个命名随你喜好。
然后在配置文件里面加上
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql:///activitidb?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
#spring.activiti.history-level=full
spring.activiti.database-schema-update=true
#spring.activiti.check-process-definitions=false
spring.activiti.process-definition-location-prefix=classpath:/processes/
最后,来写一段简单的代码
private static final Logger LOGGER = LoggerFactory.getLogger(UserServiceImpl.class);
@Autowired
private IdentityService identityService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
private FormService formService;
@Override
public String submitMsg() {
// identityService.setAuthenticatedUserId("zhangsan");
//获取当前执行的流程任务
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("my-process");
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
LOGGER.info("task1 name = {}",task.getName());
//完成第一个任务,为了让得到下面的usertask
taskService.complete(task.getId());
//获取当前处理人的节点
List<Task> list = taskService.createTaskQuery()
.processDefinitionKey("my-process")
.taskCandidateUser("user1").list();
for(Task task1:list)
{
LOGGER.info("user1处理的任务 = {}",task1.getName());
}
return null;
}
ok,然后在去访问对应的地址即可,控制层的代码我就不贴出来了 没什么意义。你也可以把这个写在单元测试类里面,还有就是我比较习惯手写一些简单的流程配置。所以格式是bpmn20.xml格式。
最后,是对应的流程文件
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"> <process id="my-process"> <startEvent id="start" /> <sequenceFlow id="flow1" sourceRef="start" targetRef="someTask1" /> <userTask id="someTask1" name="User Task1"/> <!--activiti:candidateGroups 候选组 activiti:candidateUsers 候选人--> <sequenceFlow id="flow2" sourceRef="someTask1" targetRef="someTask2" /> <userTask id="someTask2" name="User Task2" activiti:candidateGroups="group1" activiti:candidateUsers="user1,user2" /> <!--activiti:candidateGroups 候选组 activiti:candidateUsers 候选人--> <sequenceFlow id="flow3" sourceRef="someTask2" targetRef="end" /> <endEvent id="end" /> </process> </definitions>