这里写目录标题
- 1.Flowable基础
- 1.1 入门学习
- 2.流程图设计器
- 2.1 FlowableUI
- 2.1.1 绘制流程图
1.Flowable基础
官方手册
1.1 入门学习
一、依赖
<dependencies>
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-engine</artifactId>
<version>6.3.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
</dependencies>
二、demo
@Test
public void testProcessEngine() {
// 获取config对象
ProcessEngineConfiguration config = new StandaloneProcessEngineConfiguration();
// 设置数据库连接
config.setJdbcDriver("com.mysql.cj.jdbc.Driver");
config.setJdbcUsername("root");
config.setJdbcPassword("root");
// 注意:要添加nullCatalogMeansCurrent=true属性, 不然会执行报错
config.setJdbcUrl("jdbc:mysql://localhost:3306/flowable?serverTimezone=UTC&nullCatalogMeansCurrent=true");
// 如果数据库中的表结构不存在, 就新建
config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
// 构建我们需要的对象
ProcessEngine processEngine = config.buildProcessEngine();
}
三、日志文件
在resources中添加日志文件log4j.properties
log4j.rootLogger=DEBUG, CA
log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern= %d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n
2.流程图设计器
Flowable流程图
- Eclipse Designer, 一款Eclipse插件, 用于图形化建模, 测试与部署BPMN2.0流程
- FlowableUI
- Flowable BPMN visualizer, 一款idea插件
2.1 FlowableUI
从官网下载flowable-6.7.2.zip解压后, 可以看到如下两个文件
将这两个文件, 扔到tomcat中, 并启动tomcat
之后我们就可以在网页中访问FlowableUI
访问地址
账户密码:admin/test
2.1.1 绘制流程图
一、创建流程
创建一个简单的请假流程
开始 > 提交审核流程(user1) > 总经理审批流程(user2) > 结束
二、部署
绘制好的流程图, 我们只需要一键导出即可(BPMN文件)
下载后, 将文件复制到idea中
private ProcessEngineConfiguration config;
@Before
public void before() {
// 获取config对象
config = new StandaloneProcessEngineConfiguration();
// 设置数据库连接
config.setJdbcDriver("com.mysql.cj.jdbc.Driver");
config.setJdbcUsername("root");
config.setJdbcPassword("root");
// 注意:要添加nullCatalogMeansCurrent=true属性, 不然会执行报错
config.setJdbcUrl("jdbc:mysql://localhost:3306/flowable?serverTimezone=UTC&nullCatalogMeansCurrent=true");
// 如果数据库中的表结构不存在, 就新建
config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
}
/**
* 部署流程
*/
@Test
public void testDeploy() {
// 1.获取ProcessEngine对象
ProcessEngine processEngine = config.buildProcessEngine();
// 2.获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3.完成流程的部署操作
repositoryService.createDeployment()
.addClasspathResource("MyHolidayUI.bpmn20.xml")
.name("请求流程")
.deploy();
}
}
执行部署后, 我们回头看看表中的数据
act_re_procdef
act_re_deployment
三、执行流程
@Test
public void testRun() {
// 1.获取ProcessEngine对象
ProcessEngine processEngine = config.buildProcessEngine();
// 2.获取runtimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3.启动流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceById("MyHolidayUI:1:4");
System.out.println("processDefinitionId = " + processInstance.getProcessDefinitionId());
System.out.println("activityId = " + processInstance.getActivityId());
System.out.println("id = " + processInstance.getId());
}
可以通过act_ru_task查看任务流程
四、用户处理
user1对任务进行处理
@Test
public void testCompleteTask() {
// 1.获取ProcessEngine对象
ProcessEngine processEngine = config.buildProcessEngine();
// 2.获取TaskService
TaskService taskService = processEngine.getTaskService();
// 3.获取任务
Task task = taskService.createTaskQuery()
.processDefinitionKey("MyHolidayUI")
.taskAssignee("user1")
.singleResult();
// 4.创建流程变量
HashMap<String, Object> map = new HashMap<>();
map.put("approved", false);
// 5.完成任务
taskService.complete(task.getId(), map);
}
处理完成后, 任务就流转到user2了
user2对任务进行处理
@Test
public void testCompleteTask() {
// 1.获取ProcessEngine对象
ProcessEngine processEngine = config.buildProcessEngine();
// 2.获取TaskService
TaskService taskService = processEngine.getTaskService();
// 3.获取任务
Task task = taskService.createTaskQuery()
.processDefinitionKey("MyHolidayUI")
.taskAssignee("user2")
.singleResult();
// 4.创建流程变量
HashMap<String, Object> map = new HashMap<>();
map.put("approved", false);
// 5.完成任务
taskService.complete(task.getId(), map);
}
user2处理完成后, 任务就结束了, 在task表中就删除了这条记录
五、查看历史信息
@Test
public void testHistory() {
// 1.获取ProcessEngine对象
ProcessEngine processEngine = config.buildProcessEngine();
// 2.获取historyService
HistoryService historyService = processEngine.getHistoryService();
// 3.获取任务
List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery()
.processDefinitionId("MyHolidayUI:1:4")
.finished() // 查询已完成的历史记录
.orderByHistoricActivityInstanceEndTime().asc() // 指定排序的字段
.list();
for (HistoricActivityInstance history : list) {
System.out.println(history.getActivityName() + ":" + history.getAssignee() + "--"
+ history.getActivityId() + ":" + history.getDurationInMillis() + "毫秒");
}
}