• Activiti:创建activiti工程


    Activiti:创建activiti工程

    一、Activiti下载:

         1,Activiti下载地址:https://github.com/Activiti/Activiti/releases

      2,Activiti官方下载地址:http://activiti.org/download.html

      3,activiti-5.22.0.zip目录结构:

        

     其中:database是数据库脚本,包含创建、删除、升级脚本;

        docs是文档,包含开发文档、使用文档、以及流程文件;

        libs是jar包;

        wars是官方提供的demo;

    二、activiti工程示例

     1,准备工作:

      Eclipse安装activiti插件:http://activiti.org/designer/update/

     2,创建activiti工程:

     (1).新建一个activiti项目(名称:activiti):

        

     (2).在工程activiti根目录下创建lib文件夹(存放jar):

        

     (3).将activiti-5.22.0warsactiviti-rest.war中的lib解压出来,拷贝到工程的lib文件夹:

       

     (4).将mysql数据库驱动jar,拷贝到工程的lib文件夹(因为官方提供的lib中只有h2数据库驱动,没有mysql驱动);

     3,初始化数据库

      初始化数据库:mysql数据库中创建activitidb库(官方提供的脚本路径:activiti-5.22.0databasecreate),使用配置文件来创建工作流的25张表;

      方式一:直接在mysql数据库手动执行sql建表语句;

      方式二:使用代码执行:

        /** 
         * 使用框架提供的自动建表(不提供配置文件) 
         */  
        @Test  
        public void test1() {  
            // 创建一个流程引擎配置对象  
            ProcessEngineConfiguration conf = ProcessEngineConfiguration  
                    .createStandaloneProcessEngineConfiguration();  
            // 设置数据源信息  
            conf.setJdbcDriver("com.mysql.jdbc.Driver");  
            conf.setJdbcUrl("jdbc:mysql://localhost:3306/activitidbactivitidb?useUnicode=true&characterEncoding=utf8");  
            conf.setJdbcUsername("username");  
            conf.setJdbcPassword("password");  
            // 设置自动建表  
            conf.setDatabaseSchemaUpdate("true");  
            // 创建一个流程引擎对象,在创建流程引擎对象过程中会自动建表  
            ProcessEngine processEngine = conf.buildProcessEngine();  
        }  

      方式三:使用配置文件(要求配置文件名称必须为activiti-context.xml或者activiti.cfg.xml)配置的信息必须为:

      activiti-context.xml代码:

    <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">  
        <!-- 配置流程引擎配置对象 -->  
        <bean id="processEngineConfiguration"  
            class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">  
            <property name="jdbcDriver" value="com.mysql.jdbc.Driver" />  
            <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activitidb?useUnicode=true&amp;characterEncoding=utf8" />  
            <property name="jdbcUsername" value="username" />  
            <property name="jdbcPassword" value="password" />  
            <!-- 建表策略 -->  
            <property name="databaseSchemaUpdate" value="true" />  
        </bean>  
      
        <!-- 配置一个流程引擎工厂bean,用于创建流程引擎对象 -->  
        <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">  
            <!-- 通过set方法注入流程引擎配置对象 -->  
            <property name="processEngineConfiguration" ref="processEngineConfiguration" />  
        </bean>  
    </beans>  

       MysqlData.java代码:

    /** 
         * 使用框架提供的自动建表(提供配置文件)---可以从框架提供的例子程序中获取 
         */  
        @Test  
        public void test2() {  
            String resource = "activiti-context.xml";// 配置文件名称  
            String beanName = "processEngineConfiguration";// 配置id值  
            ProcessEngineConfiguration conf = ProcessEngineConfiguration  
                    .createProcessEngineConfigurationFromResource(resource,  
                            beanName);  
            ProcessEngine processEngine = conf.buildProcessEngine();  
        }  

      log4j.properties代码:

    log4j.rootLogger=INFO, CA
    
    # ConsoleAppender
    log4j.appender.CA=org.apache.log4j.ConsoleAppender
    log4j.appender.CA.layout=org.apache.log4j.PatternLayout
    log4j.appender.CA.layout.ConversionPattern= %d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n

      相关代码结构,如下图: 

       执行结果为:

      方式四:使用框架提供的自动建表(使用配置文件)

    /** 
         * 使用框架提供的自动建表(使用配置文件) 
         */  
        @Test  
        public void test3() {  
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  
        }  

      注意:import org.junit.Test;报错处理:Eclipse 在项目属性的Libararies界面 ,点“Add library",选择JUnit导入。

      我用的是第三种方式初始化数据库;

      4,创建流程图

     (1).在目录diagrams下创建Activiti Diagram文件HelloWorld.bpmn:

     (2).打开HelloWorld.bpmn,画流程图:

      点击空白处,可以修改流程文件属性:

     点击具体的流程环境,可以进行任务配置:

     可以用xml格式打开流程文件:

     5,部署流程定义

      在目录com/avtixiti/xyzq目录下新建一个HelloWorld.java文件,代码如下:

    import java.io.IOException;
    import org.activiti.engine.ProcessEngine;
    import org.activiti.engine.ProcessEngines;
    import org.activiti.engine.repository.Deployment;
    import org.junit.Test;
    import common.MysqlData;
    
    /** 
     * ClassName:HelloWorld 
     * Function: 流程图实例
     * Reason:   TODO 
     * Date:     2018年1月11日 下午2:05:09 
     * @author   lizm  
     * @since    JDK 1.6 
     *       
     */
    public class HelloWorld {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 
        /*
         *部署流程定义
         */
        @Test
        public void deploymentProcessDefinition(){
            Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service
                            .createDeployment()//创建一个部署对象
                            .name("HelloWorld入门")//添加部署名称
                            .addClasspathResource("diagrams/HelloWorld.bpmn")//从classpath的资源中加载,一次只能加载一个文件
                            .addClasspathResource("diagrams/HelloWorld.png")
                            .deploy();//完成部署
            System.out.println(deployment.getId());
            System.out.println(deployment.getName());
        }
        
        public static void main(String[] args) throws IOException {
            HelloWorld client = new  HelloWorld();
            client.deploymentProcessDefinition();
        }
    }
     

     执行,可以看到控制台,输出:

     

     对应的数据库中的表(act_re_procdef),生成数据:

     6,启动流程实例

     HelloWorld.java文件增加启动流程实例,代码如下:

    import java.io.IOException;
    import org.activiti.engine.ProcessEngine;
    import org.activiti.engine.ProcessEngines;
    import org.activiti.engine.repository.Deployment;
    import org.activiti.engine.runtime.ProcessInstance;
    import org.junit.Test;
    
    /** 
     * ClassName:HelloWorld 
     * Function: 流程图实例
     * Reason:   TODO 
     * Date:     2018年1月11日 下午2:05:09 
     * @author   lizm  
     * @since    JDK 1.6 
     *       
     */
    public class HelloWorld {
        
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 
        /*
         *部署流程定义
         */
        @Test
        public void deploymentProcessDefinition(){
            Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service
                            .createDeployment()//创建一个部署对象
                            .name("HelloWorld入门")//添加部署名称
                            .addClasspathResource("diagrams/HelloWorld.bpmn")//从classpath的资源中加载,一次只能加载一个文件
                            .addClasspathResource("diagrams/HelloWorld.png")
                            .deploy();//完成部署
            System.out.println(deployment.getId());
            System.out.println(deployment.getName());
            
        }
        
        /*
         * 启动流程实例
         */
        @Test
        public void startProcessInstance(){
            //流程定义的key
            String processDefinitionKey = "HelloWorld";
            ProcessInstance processInstance = processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service
                            .startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动流程实例,key对应HelloWorld.bpmn文件中的ID的属性值,使用key值启动,默认是按照最新版本的流程定义启动                        
            System.out.println("流程实例ID:"+processInstance.getId());//流程实例ID
            System.out.println("流程定义ID:"+processInstance.getProcessDefinitionId());//流程定义ID 
        }
        
        public static void main(String[] args) throws IOException {
            HelloWorld client = new  HelloWorld();
            client.deploymentProcessDefinition();
            client.startProcessInstance();
        }
    }
     

     控制台输出:

     数据库中表(act_ru_execution),可以看到数据生成:

     7,查询当前人的个人任务

      在HelloWorld.java中增加查询当前人的个人任务,代码如下:

      /*
         * 查询当前人的个人任务
         */
        @Test
        public void findPersonalTask(){
            String assignee = "小张";
            List<Task> list = processEngine.getTaskService()//与正在执行任务相关的Service
                            .createTaskQuery()//创建任务查询对象
                            .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());
                }
            }
        }

     控制台结果:

     数据库中表(act_ru_task),可以查到任务数据:

     8,完成任务

     在HelloWorld.java中增加完成任务,代码如下:

         /*
         * 完成我的任务
         */
        @Test
        public void completePersonalTask(){
            //任务Id
            String taskId = "12508";
            processEngine.getTaskService()//与正在执行任务相关的Service
                            .complete(taskId);
            System.out.println("完成任务:任务Id:"+taskId);
            
        }

     执行出现错误提示:java.sql.SQLException:Value '0000-00-00' can not be represented as java.sql.Date

     原因分析:“0000-00-00 00:00:00”在mysql中是作为一个特殊值存在的,但 java.sql.Date 将其视为 不合法的值 格式不正确;

     解决方案:url加上   zeroDateTimeBehavior参数(其中&amp;是&的转义);

     datasource.url=jdbc:mysql://localhost:3306/db?useUnicode=true&amp;characterEncoding=utf8&amp;zeroDateTimeBehavior=convertToNull

       注意:如果数据库连接是在xml中配置,需要进行特殊字符转义;

     控制台结果:(后续更新)

     

  • 相关阅读:
    HTML之元素分类(HTML基础知识)
    GreenPlum 与hadoop什么关系?(转)
    安装配置MySQL
    Linux下安装jdk步骤
    Linux ssh无密码登录
    左右无间切换走马灯angularJS指令
    CSS3制作立方体--有趣的应用
    hello,2017
    渐进增强与优雅降级
    图片上传预览(包含大小压缩)
  • 原文地址:https://www.cnblogs.com/lizm166/p/8251786.html
Copyright © 2020-2023  润新知