zoukankan      html  css  js  c++  java
  • activiti 用户手册中 10分钟 小例子 简单代码搭建 及 其中的 各种坑

    看mossle的 5.16 用户手册中的  快速起步:10分钟教程 

    想自己跑一下,虽然官方文档已经写的非常详细了,但是实际操作中还是遇到各种坑,这里记录下来。

    首先官网下载最新的 5版本 full Guide

    方法如下:

    百度搜索 activiti,点

    往下拉页面,

    点 no thanks continue,跳转页面到:

     

    往下拉页面,找到

    点 5.x Full Guide连接,点进去

    点图中红框部分下载。

    ==============================

     下载解压后,得到这个目录:

    目录简介:

    1) database:里面存放的是Activiti使用到的数据库信息的sql文件,使用时只需执行你自己的数据库类型的文件即可。如:你的数据库是MySQL,那么就执行activiti.mysql.create.*.sql即可。

    2) docs:毫无疑问,api文档是也【但是这个api貌似都是英文的,如果英文不好,还是建议看中文版本: http://www.mossle.com/docs/activiti/index.html】。

    3) libs:使用Activiti所需要的所有的jar包和源文件。

    4) wars:官方给我们提供的示例Demo,通过使用Demo可以更加快速的了解Activiti【还可以用这个项目直接画xml流程图,避免了在编辑器 如eclipse中安装activiti流程图绘制插件
    ================

    将其中的 wars目录中的

    放到本地tomcat下,我用的是7版本,

    然后直接启动,就可以了通过如下地址访问了:

    可以参考

    Activity工作流(2)-入门安装运行第一个例子

    这里需要说明的就是,这个Demo默认采用的是h2内存数据库,如果想用你自己的数据库,就需要修改web应用WEB-INF/classes目录下的db.properties。然后,按上面说的,把database里的create文件夹里的数据库文件导入你自己的数据库。

    改为MySQL数据库具体方法

    这里用哪个库都行,但是为了后面的代码演示,我们将上面项目的库改为mysql,

    首先在本地电脑上,创建一个mysql数据库,名字随意,我这里叫 activiti1

    然后,在刚才下载的目录下找到

    在我们自己创建的数据库里执行上面框住的3个脚本,数据库中就有表了。

    然后,

    修改tomcat下项目中的数据库配置:

    再重启tomcat,就会用我们本地的tomcat数据库了。

    然后就可以根据以下文章,操作一遍这个官方项目了:

    Activiti工作流的应用示例

    =================================================================

    下面我们用代码方式创建,也就是根据 5.16中文用户手册上的 10分钟例子,简单测试下,

    参考:5.16中文用户手册上的 10分钟例子

     但是这里我们的项目中不用Spring,不用安装Eclipse的activiti流程图插件(此插件及其难装,而且我觉得还不如直接在上面的官方项目中画流程图,再导出来好用

    因为不想用spring,所以 我们创建一个 maven的jar项目

    这个项目中,首先是 pom文件中要引入 activiti的jar包,和mysql的连接jar包:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.my</groupId>
      <artifactId>activitiTest</artifactId>
      <version>0.0.1-SNAPSHOT</version>
     
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
     
        <dependencies>
            <!-- Activiti -->
            <dependency>
                <groupId>org.activiti</groupId>
                <artifactId>activiti-engine</artifactId>
                <!-- <version>5.15.1</version> -->
                <version>5.22.0</version>
            </dependency>
            
            <dependency>
                <groupId>org.activiti</groupId>
                <artifactId>activiti-explorer</artifactId>
                <version>5.22.0</version>
            </dependency>
            
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.29</version>
            </dependency>
        
        </dependencies>
    </project>

    可以看到,整个pom文件中只需要 activiti的jar包和 mysql的连接包,非常简单。

    =====================

    第一个出现了:

    就是pom中的 activiti 版本

            <dependency>
                <groupId>org.activiti</groupId>
                <artifactId>activiti-engine</artifactId>
                <!-- <version>5.15.1</version> -->
                <version>5.22.0</version>
            </dependency>

    注意:这个版本一定要和我们数据库中的  act_ge_property 表

    中数据版本一致

    否则一会运行代码就会报如下异常:

    可以参考:

    Could not update Activiti database schema: unknown version from database: '5.20.0.1'

    ==============================================

    配置好pom,就要配置代码需要访问的数据库,为了后面测试,我们要让代码的数据库和我们之前下载好的官方guide项目中的数据库使用同一个

    而我们代码因为没有用spring集成,所以不能直接用 db.properties,而是要 一个

     activiti.cfg.xml 配置文件

    配置文件内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        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">
        
        <bean id="processEngineConfiguration"
            class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
            <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti1?characterEncoding=utf-8" />
            <property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
            <property name="jdbcUsername" value="root" />
            <property name="jdbcPassword" value="123" />
            <property name="databaseSchemaUpdate" value="true" />
        </bean>
    
    </beans>

    这里面就是配我们本地的那个数据库。

    手册中的创建ProcessEngine部分有这个配置文件的内容:

    还可以参考文章:

    activiti入门列子一个简单的activiti请假流程)  或

    我的第一个activiti实例

    =====================================================

    然后可以创建一个类,编写java代码:

    【注意:这个类中,创建 ProcessEngine 对象,不要用手册中10分钟例子那的那个方法,而是要用 getDefaultProcessEngine() 这个方法,这样才会用我们本地的activiti.cfg.xml数据库配置

    package activitiTest;
    
    import org.activiti.engine.ProcessEngine;
    import org.activiti.engine.ProcessEngineConfiguration;
    import org.activiti.engine.ProcessEngines;
    import org.activiti.engine.RepositoryService;
    import org.activiti.engine.RuntimeService;
    
    public class T1 {
    
        public static void main(String[] args) {
    
    // Create Activiti process engine 这个是用spring集成时用的,如果不用spring则用下面的getDefaultProcessEngine
    //        ProcessEngine processEngine = ProcessEngineConfiguration
    //                .createStandaloneProcessEngineConfiguration()
    //                .buildProcessEngine();
            
            ///用这个方法,才会去加载 activiti.cfg.xml 配置文件中配置的数据库
              ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
              // Get Activiti services
              RepositoryService repositoryService = processEngine.getRepositoryService();
              RuntimeService runtimeService = processEngine.getRuntimeService();
    
              // Deploy the process definition
              repositoryService.createDeployment()
                .addClasspathResource("FinancialReportProcess1.bpmn20.xml")
                .deploy();
    
              // Start a process instance
              runtimeService.startProcessInstanceByKey("financialReport");
            }
    }

    然后我们就可以继续根据官网的 10分钟教程,编写 xml 流程文件了,这时要,注意:

    官方手册中给出了一个财务月报提交审批的流程的xml,说是为了熟悉流程需要手工编写,直接把那个流程拿过来放到我们项目的resouce目录下用Eclipse用我们刚才的T1代码运行是可以的【也就是说,如果只是需要在Eclipse中运行项目,我们只需要用上面的xml即可,根本不用其他任何activiti额外的流程配置】

    但是,如果你想额外测试,将这个复制过来的“手写xml”导入到我们官网下的guide项目中是不行的,因为其缺少了 bpmn图像信息,会报错如下:

    当然,用户手册 10分钟例子处,在这个 “手写流程xml”下面 还有一个连接,说是可以下载带bpmn图像信息的 xml,是可以下载的,而且其中也确实包含bpmn元素,但是,你下载下来,往tomcat项目中导入,还是会报错:

    不止如此,如果你直接把它放在Eclipse中resource目录下,运行我们的T1代码,发现会直接报错:

    其实原因是,用户手册中提供的 xml 虽然包含了图像元素信息,但是却缺少了bpmn图像元素标签相关的头约束定义,所以Eclipse解析xml时会报错,官网guide项目无法导入也是同样原因。解决办法就是加入相关头约束,但是这个头约束在哪里找呢?

    不用在网上找,只需要在官网guide项目中随便画一个流程图(或者用已存在的流程图)导出到本地,然后用编辑器打开,就会发现,人家官网项目导出的xml中包含的头是全的,我们只需要把其复制到我们手写的 xml中即可

    下面是我添加好头部约束定义,即各种注释的 手写 财务月报流程xml:

    FinancialReportProcess1.bpmn20.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 定义开始 -->
    <!-- 下面3行是头文件,如果包含 bpmndi:BPMNDiagram 标签则不能只用这3行,要用下面那个多的 -->
    <!-- <definitions id="definitions" xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" 
        xmlns:activiti="http://activiti.org/bpmn" targetNamespace="Examples"> -->
    
    <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
        xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"
        typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath"
        targetNamespace="http://www.activiti.org/processdef">
    
    
        <process id="financialReport" name="Monthly financial report reminder process">
            <!-- 开始事件 -->
            <startEvent id="theStart"></startEvent>
            <!-- 从开始到第一个用户任务之间的箭头连线(会包含定义箭头起始点对应的节点 id) -->
            <sequenceFlow id="flow1" targetRef="writeReportTask"
                sourceRef="theStart"></sequenceFlow>
            <!-- 第一个用户任务(写月财报) -->
            <userTask id="writeReportTask" name="Write monthly financial report">
                <!-- 描述信息,可有可无 (各个标签上的name属性也是同理) -->
                <documentation>
                    write monthly finacial reoport for publication to
                    sharehollders.
                </documentation>
                <!-- 潜在拥有者 -->
                <potentialOwner>
                    <!-- 资源分配表达式 -->
                    <resourceAssignmentExpression>
                        <!-- 真正的表达式 -->
                        <formalExpression>
                            <!-- 没有显示指明是用户还是组,默认为组,这里是之会计组的成员 -->
                            accountancy
                        </formalExpression>
                    </resourceAssignmentExpression>
                </potentialOwner>
            </userTask>
    
            <!-- 从第一个用户任务到第二个用户任务之间的箭头连线(会包含定义箭头起始点对应的节点 id) -->
            <sequenceFlow id="flow2" targetRef="verifyReportTask"
                sourceRef="writeReportTask"></sequenceFlow>
    
            <!-- 第二个用户任务(领导审批任务) -->
            <userTask id="verifyReportTask" name="Verigy monthly financial report">
                <documentation>
                    Verify monthly financial report composed by the
                    accountancy department.
                    This financial report is going to be sent to
                    all the company
                    shareholders.
                </documentation>
                <potentialOwner>
                    <resourceAssignmentExpression>
                        <!-- 这个任务的潜在用户是管理组成员 -->
                        <formalExpression>management</formalExpression>
                    </resourceAssignmentExpression>
                </potentialOwner>
            </userTask>
    
            <!-- 第二个用户任务到结束节点的箭头连线 -->
            <sequenceFlow id="flow3" targetRef="theEnd" sourceRef="verifyReportTask"></sequenceFlow>
    
            <!-- 结束事件节点 -->
            <endEvent id="theEnd"></endEvent>
    
        </process>
    
        <!-- 下面是用编辑器画流程图时生成的图像信息,在Eclipse中用代码方式可以把下面的都注释 -->
        <bpmndi:BPMNDiagram>
            <bpmndi:BPMNPlane bpmnElement="financialReport">
                <bpmndi:BPMNShape bpmnElement="theStart">
                    <omgdc:Bounds height="30.0" width="30.0" x="75.0" y="225.0" />
                </bpmndi:BPMNShape>
                <bpmndi:BPMNShape bpmnElement="writeReportTask">
                    <omgdc:Bounds height="80.0" width="100.0" x="165.0" y="200.0" />
                </bpmndi:BPMNShape>
                <bpmndi:BPMNShape bpmnElement="verifyReportTask">
                    <omgdc:Bounds height="80.0" width="100.0" x="330.0" y="200.0" />
                </bpmndi:BPMNShape>
                <bpmndi:BPMNShape bpmnElement="theEnd">
                    <omgdc:Bounds height="28.0" width="28.0" x="480.0" y="226.0" />
                </bpmndi:BPMNShape>
                <bpmndi:BPMNEdge bpmnElement="flow1">
                    <omgdi:waypoint x="105.0" y="240.0" />
                    <omgdi:waypoint x="165.0" y="240.0" />
                </bpmndi:BPMNEdge>
                <bpmndi:BPMNEdge bpmnElement="flow2">
                    <omgdi:waypoint x="265.0" y="240.0" />
                    <omgdi:waypoint x="330.0" y="240.0" />
                </bpmndi:BPMNEdge>
                <bpmndi:BPMNEdge bpmnElement="flow3">
                    <omgdi:waypoint x="430.0" y="240.0" />
                    <omgdi:waypoint x="480.0" y="240.0" />
                </bpmndi:BPMNEdge>
            </bpmndi:BPMNPlane>
        </bpmndi:BPMNDiagram>
    
    </definitions>

    (上面这个xml不仅在Eclipse执行没有问题,甚至还可以直接导入到官方项目中

    这时,我们的项目就搭建完成了,就可以按照用户手册 10分钟教程中的流程继续学习了,比如 用T1代码创建并部署、启动流程后,在官方项目中通过浏览器查看启动好的财务月报流程,并进行任务领取,执行等各种操作【因为他们共有同一个数据库,而activiti最大的特点就是几乎所有与activiti相关的内容都是保存在数据库中持久化的】。

     =============

    我们使用官方guide时还要注意,每次一个用户进行流程相关操作后,如果想让另一个流程相关用户登录的信息发生变化,通常需要另一个用户先注销(退出)再重新登录,信息才会同步显示,同理如果我们用eclipse代码进行流程操作后,在guide项目中也需要用户注销再重新登录才会数据同步更新显示

    ================

    其他知识:

     摘自: activiti入门列子一个简单的activiti请假流程

    通过ProcessEngines.getDefaultProcessEngine获取流程引擎

            //通过activiti.cfg.xml获取流程引擎
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();


    通过源码可以看到  getDefaultProcessEngine方法会通过默认的activiti.cfg.xml文件名或者是activiti-context.xml文件名读取xml文件


    当获取到的processEngine对象不为空时   就会在数据库创建关于activiti的23张表

    具体作用如下:


    更详细的情况可以去下面这个地址了解:

    http://www.cnblogs.com/llzgzljl/archive/2013/10/07/3356108.html

    此时你可以在数据库中看到act_ge_property表中插入了3条数据

  • 相关阅读:
    JAVA规范
    JMS开发指南
    JMS异步消息机制
    大型系统中使用JMS优化技巧–Sun OpenMQ
    02.MyBatis配置文件详解
    elasticsearch.yml配置文件
    04.ActiveMQ与Spring JMS整合
    01.MyBatis入门
    03.JMS深入
    02.JMS基础
  • 原文地址:https://www.cnblogs.com/libin6505/p/10381710.html
Copyright © 2011-2022 走看看