• activiti第一步 -- 了解activiti、IDEA 配置activiti、测试activiti基本流程


    activiti第一步 -- 了解activiti、IDEA 配置activiti、测试activiti基本流程

    1、什么是工作流

    在了解activiti之前,先了解一下工作流系统,用官方解释就是“业务过程的部分或整体在计算机应用环境下的自动化,是对工作流程及其各操作步骤之间业务规则的抽象、概括描述”。

    按照我的理解是,作为一个流程,计算机将会帮助完成其流程的自动化运转,让业务人员专注于其自身的业务,比如请假审批流程,本来是人员填写请假申请,然后递交到审核人员,审核人员审核后填写意见,然后反馈给请假人员,如果采用了工作流,那么只需要填写请假申请和填写审核意见,其它的都交由系统完成。

    我认为这个是适用于业务场景复杂,且需要明确流程以及具体用户的工作,就可以采用工作流系统管理。

    2、什么是activiti

    那么activiti是什么,它是一种工作流引擎,用于完成工作流自动化的工作,通过计算机来达到工作流管理的效果。

    用简单的话来说,它定义了一系列规则,规定了每个流程中需要的元素和各类API,将业务流程抽象化,用户只需要配置相应的流程信息,就可以达到推动业务系统的实现了。

    3、activiti有什么用

    简化复杂的业务流程,让业务人员专注于独立的业务,业务的流转都交由系统完成,减少了人力浪费和可能出现的差错。当然软件毕竟是软件,更重要的是制度和管理,要知道这只是让业务管理更为简单的软件。

    4、我为什么要用activiti

    因为开发经理要用,其实我们项目并不完全符合工作流的要求,我们用户并不专注于独立的业务,有些角色拥有跨业务查询的能力,每个流程都要看到所有数据,好在他们还是拥有独立的业务,可以利用工作流提供每个阶段拥有业务处理能力角色。

    所以说我们在开发的时候既要让整个流程在我们设定的代码下运行,同时要推动工作流一步一步进行下去,而工作流提供给我们的就是该阶段的用户角色。

    5、BPM和工作流区别

    这两个都是有关于过程管理的概念,按照我的理解,BPM更专注于全局性的过程流程与控制,而工作流则更适用于让流程自动化的场景,工作流的发展推动了BPM的发展,而BPM的发展则更倾向于更全局的控制。

    6、流程

    讲完这些之后我想说说流程,流程流转于我们身边每一个环节,让流程运转的更为流畅、安全、高效,事情也能随之事半功倍,这也是管理的一部分,随着企业发展,企业越来越大,管理的难度也会随着变大,那么制度和相应的管理也要随之更改,这个时候流程的控制重要性也会越来越高,所以BPM在未来的发展会越来越凸显其重要性。

    7、IDEA+SpringMVC+mysql配置activiti

    以下所有配置都默认在idea已经配置好能够运行项目的情况下,不会讲什么jdk、mysql、maven如何配置

    (1)IDEA actiBPM插件配置

    actiBPM是一款能够让idea支持bpm文件编辑的插件,只需要在File->setting->Plugins里面安装即可,点击browse repositories搜索actiBPM下载安装,然后按提示重启idea,创建一个bpm文件就可以启动插件

    (2)Maven配置

    其实应该只需要activiti-engine、activiti-spring、activiti-bpmn-layout就可以了吧

    <activiti.version>5.18.0</activiti.version>

    <!-- activiti BEGIN -->
    <dependency>
    	<groupId>org.activiti</groupId>
    	<artifactId>activiti-engine</artifactId>
    	<version>${activiti.version}</version>
    </dependency>
    <dependency>
    	<groupId>org.activiti</groupId>
    	<artifactId>activiti-bpmn-model</artifactId>
    	<version>${activiti.version}</version>
    </dependency>
    <dependency>
    	<groupId>org.activiti</groupId>
    	<artifactId>activiti-bpmn-converter</artifactId>
    	<version>${activiti.version}</version>
    </dependency>
    <dependency>
    	<groupId>org.activiti</groupId>
    	<artifactId>activiti-process-validation</artifactId>
    	<version>${activiti.version}</version>
    </dependency>
    <dependency>
    	<groupId>org.activiti</groupId>
    	<artifactId>activiti-bpmn-layout</artifactId>
    	<version>${activiti.version}</version>
    </dependency>
    <dependency>
    	<groupId>org.activiti</groupId>
    	<artifactId>activiti-spring</artifactId>
    	<version>${activiti.version}</version>
    </dependency>
    <!-- activiti END -->
    
    (3)Spring-config-activiti 配置

    在这里配置相关的数据库连接池以及工作流引擎的对象管理

     <bean id="acitvityDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!-- 基本属性 url、user、password -->
        <property name="url" value="${connection_activiti.url}"/>
        <property name="username" value="${connection_activiti.username}"/>
        <property name="password" value="${connection_activiti.password}"/>
    </bean>
    
    <!-- 创建事务管理器 -->
    <bean id="activiti_transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="acitvityDataSource" />
    </bean>
    
    <!-- 创建流程引擎配置对象 -->
    <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
        <property name="dataSource" ref="acitvityDataSource" />
        <property name="transactionManager" ref="activiti_transactionManager" />
        <property name="databaseSchemaUpdate" value="true" />
        <!-- 使用spring的自动资源加载部署方式部署 -->
        <property name="deploymentResources" value="classpath*:activiti/*.bpmn" />
    </bean>
    
    <!--  创建流程引擎对象-->
    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
        <property name="processEngineConfiguration" ref="processEngineConfiguration" />
    </bean>
    <bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService" />
    
    <bean id="formService" factory-bean="processEngine" factory-method="getFormService" />
    
    <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />
    <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" />
    <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" />
    <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" />
    <bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" />
    
    (4)编写Tset用例,查看是否成功配置

    使用三个sql文件创建activiti需要的表
    (orgactivitiactiviti-engine5.18.0org.activiti.db.create中)
    activiti.mysql.create.engine.sql

    activiti.mysql.create.history.sql

    activiti.mysql.create.identity.sql

    另外还有一种方法:
    // 如果之前没有创建activiti相关的表,调用它会自动创建,由activiti-context.xml文件内容创建

       DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();  
    

    如果没有报错,且正常运行,那么说明就可以了,配置就到此成功了。数据库也生成了相应的数据库表。接下来就是写流程,一步步推动activiti往下走。

    显示结果:
    插入一大堆数据到数据库,完后模板部署,返回两个ID,使用两个ID逐步完成各项任务。
    流程实例ID:10005
    流程定义ID:bpmTest:1:10004

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations ={
    "classpath:spring-config.xml",
        "classpath:spring-mvc.xml"})
    public class ActivitiTest {
        @Autowired
        private ProcessEngine processEngine;
        @Autowired
        private RuntimeService runtimeService;
        @Autowired
        private TaskService taskService;
        @Autowired
        private ManagementService managerService;
        @Autowired
        private IdentityService identityService;
        @Autowired
        private FormService formService;
        @Autowired
        private HistoryService historyService;
    
        /**
         *启动,创建一个流程实例
         */
        @Test()
        public void testCreateProcessInstance() throws Exception{
                // 个人资料
                Map<String, Object> variables = new HashMap<String, Object>();
                variables.put("姓名", "程序员");
                variables.put("职务", "高级软件工程师");
                variables.put("语言", "Java/C#");
                variables.put("事务", "请假");
    
                // 获取创建一个实例
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("bpmTest",variables);  //这里面的值就是点击BPM页面空白处所显示的ID
                System.out.println("流程实例ID:" + pi.getId());
                System.out.println("流程定义ID:" + pi.getProcessDefinitionId());
        }
    }
    

    ###6、大致activiti完整流程测试用例编写和理解
    (1)第一步,启动实例,因为spring配置已经配置了该BPM路径,所以同时也会部署流程图,这一步用的也就是上面写的测试用例,这个时候就可以用两个ID完成更多的操作。

    结果:
    流程实例ID:12505
    流程定义ID:bpmTest:2:12504

        /**
         * 启动并部署实例
         * @throws Exception
         */
        @Test()
        public void testRunProcess()throws Exception{
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("bpmTest");
                System.out.println("流程实例ID:" + pi.getId());
                System.out.println("流程定义ID:" + pi.getProcessDefinitionId());
        }
    
    (2)查看个人的任务
    	/**
         *  查看个人任务
         */
        @Test()
        public void searchSelfTask() throws Exception{
                String assignee = "emply";
                String process_id="17501";  //指的是act_ru_task中的PROC_INST_ID
                List<Task> list = taskService.createTaskQuery()// 与正在执行的任务管理相关的Service
                        .processInstanceId(process_id) //指定任务进程
                        .taskAssignee(assignee)// 指定个人任务查询,指定办理人
                        .list();
                if (list != null && list.size() > 0) {
                        for (Task task : list) {
                                System.out.println("任务ID:" + task.getId());
                                System.out.println("任务名称:" + task.getName());
                                System.out.println("任务的创建时间:" + task.getCreateTime());
                                System.out.println("任务的办理人:" + task.getAssignee());
                                System.out.println("流程实例ID:" + task.getProcessInstanceId());
                                System.out.println("执行对象ID:" + task.getExecutionId());
                                System.out.println("流程定义ID:" + task.getProcessDefinitionId());
                                System.out.println("########################################################");
                        }
                }
        }
    
    (3)执行任务,将会流转到下一个,同时数据库中act_ru_task里面的任务状态会更新为下一个的状态,bpmTest:3:15006,生成新的任务ID,指派新的人。
        public void testCommiTask() throws Exception{
                String assignee="emply";
                String process_id="17501";
                Task task = taskService//与正在执行的任务管理相关的Service
                        .createTaskQuery()//创建任务查询对象
                                /**查询条件(where部分)*/
                        .processInstanceId(process_id)
                        .taskAssignee(assignee)//指定个人任务查询,指定办理人
                        .singleResult();//返回列表
                //完成任务
                taskService.complete(task.getId());
                System.out.println("已完成任务提交");
        }
    
    (4)完成指定任务,这个时候所有任务都完成,act_ru_task中的任务消失,进入historytask中可以查询到该任务信息,到此整个小流程就此走完,还有很多东西需要继续研究,比如说回退操作、网关判断、分支等操作。接下来慢慢讲吧。
    	/**
         * 完成指定任务
         */
        @Test()
        public void testComplete() throws Exception{
                String taskId1="20002";
                String taskId2="15011";
                //完成任务的同时,设置流程变量,让流程变量判断连线该如何执行
                Map<String, Object> variables = new HashMap<String, Object>();
                variables.put("flag", 0);
                //完成任务
                taskService.complete(taskId1,variables);  //带参数完成
                System.out.println("带参数的任务完成");
                taskService.complete(taskId2);
                System.out.println("不带参数的任务完成");
        }
  • 既然不能成为屠龙的勇士,那么就好好成为一名优秀的管家,为公主建设一个温馨美好的家。
    Since it can not become a dragon warrior, then it is a good housekeeper, for the princess to build a warm and beautiful home.

  • 相关阅读:
    网络爬虫基础练习
    综合练习:词频统计
    Hadoop综合大作业
    理解MapReduce
    熟悉常用的HBase操作
    第三章、熟悉常用的HDFS操作
    爬虫大作业
    数据结构化与保存
    使用正则表达式,取得点击次数,函数抽离
    爬取校园新闻首页的新闻
  • 原文地址:https://www.cnblogs.com/ITflying/p/7570021.html
  • Copyright © 2020-2023  润新知