Activiti:建立activiti工程

Activiti:建立activiti工程

1、Activiti下載:

     1,Activiti下載地址:https://github.com/Activiti/Activiti/releaseshtml

  2,Activiti官方下載地址:http://activiti.org/download.htmljava

  3,activiti-5.22.0.zip目錄結構:
mysql

    

 其中:database是數據庫腳本,包含建立、刪除、升級腳本;git

    docs是文檔,包含開發文檔、使用文檔、以及流程文件;github

    libs是jar包;spring

    wars是官方提供的demo;sql

2、activiti工程示例

 1,準備工做:

  Eclipse安裝activiti插件:http://activiti.org/designer/update/數據庫

 2,建立activiti工程:

 (1).新建一個activiti項目(名稱:activiti):apache

    

 (2).在工程activiti根目錄下建立lib文件夾(存放jar):app

    

 (3).將activiti-5.22.0\wars\activiti-rest.war中的lib解壓出來,拷貝到工程的lib文件夾:

   

 (4).將mysql數據庫驅動jar,拷貝到工程的lib文件夾(由於官方提供的lib中只有h2數據庫驅動,沒有mysql驅動);

 3,初始化數據庫

  初始化數據庫:mysql數據庫中建立activitidb庫(官方提供的腳本路徑:activiti-5.22.0\database\create),使用配置文件來建立工做流的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中配置,須要進行特殊字符轉義;

 控制檯結果:(後續更新)

相關文章
相關標籤/搜索