美文网首页
activiti工作流引擎入门&Spring配合

activiti工作流引擎入门&Spring配合

作者: 田文健 | 来源:发表于2017-11-22 16:46 被阅读0次

之前做的一个项目因为流程需求改动频繁,导致修改工作量极大。这次又要开发一个流程性质的项目。考虑使用工作流引擎。在权衡几种工作流引擎的之后,考虑学习使用比较热门的activiti。、
首先在maven中加入activiti的依赖,如果和Spring配合使用的话,有两个

<!--activiti work flow -->
    <dependency>
      <groupId>org.activiti</groupId>
      <artifactId>activiti-engine</artifactId>
      <version>${activyty.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.activiti/activiti-spring -->
    <dependency>
      <groupId>org.activiti</groupId>
      <artifactId>activiti-spring</artifactId>
      <version>${activyty.version}</version>
    </dependency>

然后在在Spring的配置文件中加入:

<!-- Activiti处理引擎的配置,交由Spring管理 -->
    <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">

        <!-- 配置数据源,和系统使用同一个数据源 -->
        <property name="dataSource" ref="dataSource" />
        <property name="databaseSchemaUpdate" value="true" />
        <property name="jobExecutorActivate" value="false" />
        <!-- 统一的事务管理 -->
        <property name="transactionManager" ref="transactionManager" />
        <property name="deploymentResources" value="classpath*:/activiti/*.bpmn20.xml" />
    </bean>

    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
        <property name="processEngineConfiguration" ref="processEngineConfiguration" />
    </bean>

    <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" />

这里的dataSource 是我在项目中的数据源,这样的话activiti的表会和项目的表在同一个数据库中。事务管理器也是使用同一个,activiti的事务可以和业务逻辑事务同步。

然后关注下面的几个bean。
repositoryService 是activiti管理静态资源的服务,利用它可以部署和管理流程文件。

runtimeService 运行时服务,可以启动一个工作流过程实例。
taskService 任务管理服务,获取或者是完成任务。
historyService 历史记录服务。

然后在写一个idInfo.bpmn20.xml放在resource的activiti目录下(目录可以随意,和配置中的deploymentResources项一样就行,它会自动在这个目录下面找对应的文件部署)

<?xml version="1.0" encoding="UTF-8" ?>
<definitions id="definitions"
             targetNamespace="http://activiti.org/bpmn20"
             xmlns:activiti="http://activiti.org/bpmn"
             xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">

    <process id="financialReport" name="Monthly financial report reminderprocess">

        <startEvent id="theStart" />

        <!--顺序流 可以加条件-->
        <sequenceFlow id='flow1' sourceRef='theStart' targetRef='writeReportTask' />

        <userTask id="writeReportTask" name="Write monthly financial report" >
            <documentation>
                Write monthly financial reportfor publication to shareholders.
            </documentation>
            <potentialOwner>
                <resourceAssignmentExpression>
                    <formalExpression>sales</formalExpression>
                </resourceAssignmentExpression>
            </potentialOwner>
        </userTask>

        <sequenceFlow id='flow2' sourceRef='writeReportTask' targetRef='verifyReportTask' />

        <userTask id="verifyReportTask" name="Verify monthly financial report" >
            <documentation>
                Verify monthly financial reportcomposed by the accountancy department.
                This financial report is goingto be sent to all the company shareholders.
            </documentation>
            <potentialOwner>
                <resourceAssignmentExpression>
                    <formalExpression>management</formalExpression>
                </resourceAssignmentExpression>
            </potentialOwner>
        </userTask>

        <sequenceFlow id='flow3' sourceRef='verifyReportTask' targetRef='theEnd' />

        <endEvent id="theEnd" />

    </process>

</definitions>

然后就可以开始进行测试了,先执行下面的测试代码(我在Junit环境下跑的)

//processEngine 已通过注解注入获得
log.debug("name is " + processEngine.getName());
        TaskService taskService = processEngine.getTaskService();
       //FormService formService = processEngine.getFormService();
        HistoryService historyService = processEngine.getHistoryService();

        // 部署流程定义
//        RepositoryService repositoryService = processEngine.getRepositoryService();
//        repositoryService.createDeployment().addClasspathResource("activiti/idInfo.bpmn20.xml").deploy();
        // 启动流程实例
        RuntimeService runtimeService = processEngine.getRuntimeService();
        String procId = runtimeService.startProcessInstanceByKey("financialReport").getId();
        // 获得第一个任务
        List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("sales").list();
        for (Task task : tasks) {
            System.out.println("Following task is available for sales group: " + task.getName());
            // 认领任务这里由foozie认领,因为fozzie是sales组的成员
            taskService.claim(task.getId(), "fozzie");
        }
        // 查看fozzie现在是否能够获取到该任务
        tasks = taskService.createTaskQuery().taskAssignee("fozzie").list();
        for (Task task : tasks) {
            System.out.println("Task for fozzie: " + task.getName());
            // 执行(完成)任务
            taskService.complete(task.getId());
        }
        // 现在fozzie的可执行任务数就为0了
        System.out.println("Number of tasks for fozzie: "
                + taskService.createTaskQuery().taskAssignee("fozzie").count());
        // 获得第二个任务
        tasks = taskService.createTaskQuery().taskCandidateGroup("management").list();
        for (Task task : tasks) {
            System.out.println("Following task is available for accountancy group:" + task.getName());
            // 认领任务这里由kermit认领,因为kermit是management组的成员
            taskService.claim(task.getId(), "kermit");
        }
        // 完成第二个任务结束流程
        for (Task task : tasks) {
            taskService.complete(task.getId());
        }
        // 核实流程是否结束,输出流程结束时间
        HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
                .processInstanceId(procId).singleResult();
        System.out.println("Process instance end time: " + historicProcessInstance.getEndTime());

以上就是简单的activiti入门使用过程。

相关文章

网友评论

      本文标题:activiti工作流引擎入门&Spring配合

      本文链接:https://www.haomeiwen.com/subject/wmcovxtx.html