? ? ? ? 上周項目經(jīng)理交給新的任務(wù),在現(xiàn)在的工作基礎(chǔ)上整合工作流引擎,技術(shù)選型選的是activiti6.0,于是我在網(wǎng)上就找各種資料整合,大部分的是先在pom.xml文件內(nèi)添加依賴:
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>de.odysseus.juel</groupId>
<artifactId>juel-api</artifactId>
<version>2.2.7</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-process-validation</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-form-api</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-dmn-api</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-image-generator</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-model</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-converter</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>de.odysseus.juel</groupId>
<artifactId>juel-impl</artifactId>
<version>2.2.7</version>
再在application.yml文件中增加如下配置:
spring:
activiti:
database-schema-update: true
history-level: full
process-definition-location-prefix: classpath:/processes/
datasource:
url: jdbc:mysql://127.0.0.1:3306/demo_workflow?useUnicode=true&characterEncoding=UTF-8
username: root
password: root
driverClassName: com.mysql.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
然后再用activiti.cfg.xml獲取processEngine,配置如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!--這里的類太多別導(dǎo)錯了 -->
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!-- 配置流程引擎配置對象 -->
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/demo_workflow?useUnicode=true&characterEncoding=UTF-8"></property>
<property name="jdbcUsername" value="root"></property>
<property name="jdbcPassword" value="root"></property>
<!-- 注入數(shù)據(jù)源信息 -->
<property name="databaseSchemaUpdate" value="true"></property>
</bean>
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<!-- 注入自動建表設(shè)置 -->
<property name="processEngineConfiguration" ref="processEngineConfiguration"></property>
</bean>
</beans>
然后在啟動類里添加這個注解
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})
還需要在resources下新建目錄processes文件夾,里邊需要新建流程文件,流程文件為.bomn文件,然后將它復(fù)制一份改名為xml,注意xml文件的結(jié)尾需為bpmn.xml或者bpmn20.xml不然會找不到相關(guān)流程配置文件。
下面貼上簡單的業(yè)務(wù)流程圖:
業(yè)務(wù)流程圖
? ? ? ? 接下來需要在項目里的controller里寫一些流程代碼來部署,啟動,流轉(zhuǎn)流程。
下邊貼上部分代碼:
@RestController
@RequestMapping(value = "/activitiService")
public class DemoController {
private static final Logger logger = LoggerFactory.getLogger(DemoController.class);
/**
* 流程定義和部署相關(guān)的存儲服務(wù)
*/
@Autowired
private RepositoryService repositoryService;
/**
* 流程運行時相關(guān)的服務(wù)
*/
@Autowired
private RuntimeService runtimeService;
/**
* 節(jié)點任務(wù)相關(guān)操作接口
*/
@Autowired
private TaskService taskService;
/**
* 歷史記錄相關(guān)服務(wù)接口
*/
@Autowired
private HistoryService historyService;
@RequestMapping(value = "/start")
public String start() {
Deployment deployment = repositoryService.createDeployment()//創(chuàng)建一個部署對象
.name("離司流程")
.addClasspathResource("processes/salemanResignDemo.bpmn")
.addClasspathResource("diagrams/salemanResignDemo.png")
.deploy();
logger.info("部署ID:" + deployment.getId());
logger.info("部署名稱:" + deployment.getName());
// //查詢流程定義
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
//在流程模板中定義的流程ID
String instanceKey = processDefinition.getId();
logger.info("開啟離司流程...");
//設(shè)置流程參數(shù),開啟流程
Map<String, Object> map = new HashMap<String, Object>();
map.put("salemanNo", "110234");
map.put("resignReason", "個人原因");
//使用流程定義的key啟動流程實例,key對應(yīng)salemanResignDemo.bpmn文件中id的屬性值,使用key值啟動,默認(rèn)是按照最新版本的流程定義啟動
ProcessInstance instance = runtimeService.startProcessInstanceById(instanceKey, map);
logger.info("啟動流程實例成功:{}", instance);
logger.info("流程實例ID:{}", instance.getId());
logger.info("流程定義ID:{}", instance.getProcessDefinitionId());
//驗證是否啟動成功
//通過查詢正在運行的流程實例來判斷
ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery();
//根據(jù)流程實例ID來查詢
List<ProcessInstance> runningList = processInstanceQuery.processInstanceId(instance.getProcessInstanceId()).list();
logger.info("根據(jù)流程ID查詢條數(shù):{}", runningList.size());
// 返回流程ID
return instance.getId();
}
@RequestMapping(value = "/applyResign")
public String applyResign(@RequestParam String taskId, String salemanNo, String resignReason) {
/*
* 獲取請求參數(shù)
*/
// String taskId;
List<Task> list = taskService.createTaskQuery().taskAssignee("xiaoli").list();
/*
* 查詢?nèi)蝿?wù)
*/
if (list != null && list.size() > 0) {
for (Task task : list) {
logger.info("任務(wù)ID:" + task.getId());
logger.info("任務(wù)名稱:" + task.getName());
logger.info("任務(wù)的創(chuàng)建時間:" + task.getCreateTime());
logger.info("任務(wù)的辦理人:" + task.getAssignee());
logger.info("流程實例ID:" + task.getProcessInstanceId());
logger.info("執(zhí)行對象ID:" + task.getExecutionId());
logger.info("流程定義ID:" + task.getProcessDefinitionId());
taskId = task.getId();
}
} else {
logger.info("任務(wù)ID:{}查詢到任務(wù)為空!");
return "fail";
}
/*
* 參數(shù)傳遞并提交申請
*/
Map<String, Object> map = new HashMap<String, Object>();
map.put("salemanNo", salemanNo);
map.put("resignReason", resignReason);
taskService.complete(taskId, map);
logger.info("執(zhí)行【員工離司申請】環(huán)節(jié),流程推動到【主管審核】環(huán)節(jié)");
/*
* 返回同意
*/
return "success";
}
關(guān)于數(shù)據(jù)庫表的說明,我在網(wǎng)上看到一張圖,我就直接拿來用吧,事先聲明這不是原創(chuàng)的圖片:
來源于網(wǎng)絡(luò)
可以看看,哪里有問題歡迎批評指正,如有遺漏,及時聯(lián)系我。