最近項(xiàng)目需要在項(xiàng)目中嵌入activiti工作流并提供在線流程編輯設(shè)計(jì)功能,經(jīng)過網(wǎng)上各種資料查詢,都是基本的springboot整合activiti6,
然后用activiti6提供的各種服務(wù)api實(shí)現(xiàn)自己的業(yè)務(wù)邏輯代碼,
但是我們都知道 activiti6下載包中包含activiti-app模塊,該模塊已經(jīng)幫我們實(shí)現(xiàn)了基于web的流程設(shè)計(jì)器,那我們怎么將activiti-app整和到我們的 springboot項(xiàng)目中呢目前沒有找到可參考的整合方案,于是本人經(jīng)過嘗試終于成功將activiti6中的activiti-app模塊整合到目前springboot2.1.7版本的項(xiàng)目中,實(shí)現(xiàn)了項(xiàng)目的流程在線編輯功能?,F(xiàn)將整合中比較重要的幾點(diǎn)記錄如下
整合步驟:
1:添加maven 包依賴:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
</dependencyManagement>
<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>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-app-rest</artifactId>
<version>${activiti.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
注意:整合activiti-app 就是整合 activiti-app-rest,導(dǎo)入這個(gè)jar包后 可能會報(bào)log沖突相關(guān)的錯(cuò)誤,需要再導(dǎo)入jar包的時(shí)候 排除 slf4j
引入spring-boot-starter-data-jpa 因?yàn)閍ctiviti-app自帶的相關(guān)功能 的持久化模塊采用的jpa
- 數(shù)據(jù)源配置 activiti相關(guān)配置 留意注解
spring:
activiti:
async-executor-activate: true
database-schema-update: true
#設(shè)置為true時(shí) 啟動(dòng)項(xiàng)目自動(dòng)為我們創(chuàng)建activiti相關(guān)的數(shù)據(jù)表
check-process-definitions: false
process-definition-location-prefix: classpath*:/processes/
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver#/新的mysql驅(qū)動(dòng)
# 如果沒有自動(dòng)生成數(shù)據(jù)表 mysql連接后增加 nullCatalogMeansCurrent=true 具體原理可自行查看
url: jdbc:mysql://xxxxxxxx:3306/xxx?characterEncoding=utf-8&serverTimezone=UTC&nullCatalogMeansCurrent=true
username: xxx
password: xxx
type: com.zaxxer.hikari.HikariDataSource #連接池
hikari:
connection-test-query: SELECT 1
#很多整合方案中 建議 liquibase.enabled=false,但是再整合activiti-app-rest 時(shí)需要設(shè)置為true因?yàn)閍ctiviti-app-rest 用 liquibase管理了一些流程設(shè)計(jì)相關(guān)的表
#比如ACT_DE_MODEL等,liquibase需要的db.changelog-master.xml可以再activiti-app-rest中去找
liquibase:
enabled: true
change-log: classpath:changelog.xml
# activiti-app-rest 中 FileSystemContentStorage 的相關(guān)配置用來再文件系統(tǒng)中保存相關(guān)東西
contentstorage:
fs:
rootFolder: /data
createRoot: true
depth: 4
blockSize: 1024
3.org.activiti.spring.boot.SecurityAutoConfiguration
//啟動(dòng)時(shí)排除org.activiti.spring.boot.SecurityAutoConfiguration.class activiti中的這個(gè)類,這是activiti-app-rest默認(rèn)使用的SpringSecurity 的相關(guān)配置類,去掉后,我們自己的項(xiàng)目必須要引入SpringSecurity 因?yàn)閍ctiviti-app-rest 獲取當(dāng)前用戶是通過 SpringSecurity 的 authentication對象
@SpringBootApplication(exclude = org.activiti.spring.boot.SecurityAutoConfiguration.class)
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
//再自己的UserDetailsService loadUserByUsername 方法中封裝ActivitiAppUser 這是 activiti-app-rest中的SpringSecurity User
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserEF userExists = userEfService.GetUserByAccount(username.trim());
if(userExists != null) {
List<org.activiti.engine.identity.User> activitUsers = identityService.createUserQuery()
.userId(userExists.getId().toString())
.list();
if(CollectionUtils.isNotEmpty(activitUsers)) {
ActivitiAppUser acu = new ActivitiAppUser(activitUsers.get(0),username.trim(),AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
return acu;
//return new User(username.trim(),userExists.getUserPwd().trim(),AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
}
}
return null;
}
4.注意點(diǎn)
需要將activiti-app-rest 中的控制器和 jpa 相關(guān)的dao Entity引入引入到項(xiàng)目中
5.整合完成后,流程在線配置可以直接調(diào)用 activiti-app 中的配置功能包括界面和接口,但是activit-app中的表單配置功能有問題。
1.創(chuàng)建的表單和流程關(guān)聯(lián)后,流程發(fā)起時(shí)獲取關(guān)聯(lián)表單配置報(bào)錯(cuò)
2.流程發(fā)布后 關(guān)聯(lián)的表單無法發(fā)布,涉及的數(shù)據(jù)表數(shù)據(jù)為空 act_fo_form_deployment,act_fo_form_definition ,act_fo_* 等
解決辦法:
引入包
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-form-engine-configurator</artifactId>
<version>${activiti.version}</version>
</dependency>
1.構(gòu)建 FormEngineConfigurator 對象
2. 創(chuàng)建類繼承ProcessEngineConfigurationConfigurer 接口
3. 在ProcessEngineConfigurationConfigurer接口的實(shí)現(xiàn)類中將 FormEngineConfigurator對象注入到
SpringProcessEngineConfiguration 中 如下:
@Component
public class MiniProcessEngineConfigurationConfigurer implements ProcessEngineConfigurationConfigurer {
@Autowired
private FormEngineConfigurator formEngineConfigurator;
@Override
public void configure(SpringProcessEngineConfiguration processEngineConfiguration) {
processEngineConfiguration.addConfigurator(formEngineConfigurator);
}
}
最后實(shí)現(xiàn)的效果如下:

參考文章