springboot1.5.4和activiti6.0整合(一)

? ? ? ? 上周項目經(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&amp;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)系我。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容