Activiti
DB中各個表的作用
Activiti的后台是有數據庫的支持,所有的表都以ACT_開頭。 第二部分是表示表的用途的兩個字母標識。 用途也和服務的API對應。
ACT_RE_*: 'RE'表示repository。 這個前綴的表包含了流程定義和流程靜態資源 (圖片,規則,等等)。
ACT_RU_*: 'RU'表示runtime。 這些運行時的表,包含流程實例,任務,變量,異步任務,等運行中的數據。 Activiti只在流程實例執行過程中保存這些數據, 在流程結束時就會刪除這些記錄。 這樣運行時表可以一直很小速度很快。
ACT_ID_*: 'ID'表示identity。 這些表包含身份信息,比如用戶,組等等。
ACT_HI_*: 'HI'表示history。 這些表包含歷史數據,比如歷史流程實例, 變量,任務等等。
ACT_GE_*: 通用數據, 用於不同場景下,如存放資源文件。
兩種整合方式
不使用SpringBootStarter
依賴
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>6.0.0</version>
</dependency>
<!--其他依賴有需要再加-->
數據源
server:
port: 80
spring:
datasource:
url: jdbc:mysql://121.41.224.124:3307/activiti1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&nullCatalogMeansCurrent=true&autoReconnect=true
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123
activiti:
database-schema-update: true
check-process-definitions: true
process-definition-location-prefix: classpath:/processes/
# process-definition-location-suffixes:
# - **.bpmn
# - **.bpmn20.xml
history-level: full
需要注意的是,在url中,添加了針對數據庫的條件,其中最后一條nullCatalogMeansCurrent=true非常重要,至於有什么用就不概述了,但是沒有這條語句的話就無法自動創建對應的二十八張表
配置
@Configuration
public class ActivitiConfig {
/*
* 配置分為以下幾步驟
* 1. 創建ActivitiConfig
* 2. 使用ActivitiConfig創建ProcessEngineFactoryBean
* 3. 使用ProcessEngineFactoryBean創建ProcessEngine對象
* 4. 使用ProcessEngine對象創建需要的服務對象
* */
private Logger logger = LoggerFactory.getLogger(ActivitiConfig.class);
private final DataSource dataSource;
private final PlatformTransactionManager platformTransactionManager;
@Autowired
public ActivitiConfig(DataSource dataSource, PlatformTransactionManager platformTransactionManager) {
this.dataSource = dataSource;
this.platformTransactionManager = platformTransactionManager;
}
/*
* 1. 創建配置文件,也就是提供一些配置信息,這樣就可以自定義自己的創建信息了
* 需要一些參數,1. 數據源。2. 事務管理器。
* 這里還加入了自動掃描process包下的bpmn(流程定義文件)的設置,這樣就可以省去了部署
* */
@Bean
public SpringProcessEngineConfiguration springProcessEngineConfiguration() {
SpringProcessEngineConfiguration spec = new SpringProcessEngineConfiguration();
spec.setDataSource(dataSource);
spec.setTransactionManager(platformTransactionManager);
spec.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
Resource[] resources = null;
// 啟動自動部署流程
try {
resources = new PathMatchingResourcePatternResolver().getResources("classpath*:process/*.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();
}
}
使用Starter
依賴
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M3.1</version>
</dependency>
需要注意的是,這里的依賴版本,需要對應數據庫中act_ge_property表中schema.version版本信息,所以一般不建議在創建完表之后修改依賴信息
application.propertie
spring.activiti.database-schema-update=true
spring.activiti.process-definition-location-prefix=classpath:/process/
# 這里還是記得注意最后面添加url時添加的語句
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&nullCatalogMeansCurrent=true
spring.datasource.username=root
spring.datasource.password=root
從BPMN文件讀取一個工作流
@Autowired
RepositoryService repositoryService;
@Autowired
TaskService taskService;
@Test
public void deploy() {
//獲取倉庫服務 :管理流程定義
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deploy = repositoryService.createDeployment()//創建一個部署的構建器
.addClasspathResource("XXXXXXXX/LeaveActiviti.bpmn")//從類路徑中添加資源,一次只能添加一個資源
.name("請求單流程")//設置部署的名稱
.category("辦公類別")//設置部署的類別
.deploy();
System.out.println("部署的id"+deploy.getId());
System.out.println("部署的名稱"+deploy.getName());
}
運行一個工作流
@Autowired
RuntimeService runtimeService;
/**
* 運行一個工作流
*/
@Test
void startProcess() {
//指定執行我們剛才部署的工作流程
String processDefKey = "leave";
//取運行時服務
if (runtimeService != null) log.error("Engine Success");
//取得流程實例
ProcessInstance instance = runtimeService.startProcessInstanceById("PROCESS_1:1:7504");
System.out.println("流程實例id:"+instance.getId());//流程實例id
System.out.println("流程定義id:"+instance.getProcessDefinitionId());//輸出流程定義的id
}
運行結果:
2021-01-14 09:57:45.303 ERROR 6882 --- [ main] com.codedef.ActivitiApplicationTests : Engine Success
流程實例id:10001
流程定義id:PROCESS_1:1:7504
查詢所有待辦
/**
* 查詢待辦
*/
@Test
void getTaskList() {
List<Task> tasks = taskService.createTaskQuery().list();
log.info("tasks len: " + tasks.size());
tasks.stream().forEach(e -> {
System.out.println(e);
});
}
運行結果:
2021-01-14 10:23:00.962 INFO 8496 --- [ main] com.codedef.ActivitiApplicationTests : tasks len: 1
Task[id=15005, name=提交申請]
查詢某個人的待辦
/**
* 根據代理人查詢當前任務的信息
*/
@Test
void getTaskByAssignee() {
String assignee;
List<Task> list;
//創建一個任務查詢對象
TaskQuery taskQuery = taskService.createTaskQuery();
//任務的辦理人
assignee = "老大";
log.info("老大的任務:");
list = taskQuery.taskAssignee(assignee).list();
list.stream().forEach(e -> {
System.out.println(e);
});
System.out.println("\n\n\n\n");
//任務的辦理人
assignee = "小張";
log.info("小張的任務:");
list = taskQuery.taskAssignee(assignee).list();
list.stream().forEach(e -> {
System.out.println(e);
});
}
運行結果:
com.codedef.ActivitiApplicationTests : 小張的任務:
Task[id=15005, name=提交申請]
處理一個任務
/**
* 完成一個任務
*/
@Test
void compileTask() {
String taskId="15005";
//taskId:任務id
taskService.complete(taskId);
System.out.println("當前任務執行完畢");
}
NOTICE: 執行完該Test后,ACT_RU_TASK表中的“小張:提交申請”的記錄消失,出現“老大:經理審批”記錄。
此時再次執行查詢任務的Test,小張的任務為空,老大的任務中出現一條記錄“Task[id=17502, name=經理審批]”。