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&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參數(其中&是&的轉義);
datasource.url=jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
注意:若是數據庫鏈接是在xml中配置,須要進行特殊字符轉義;
控制檯結果:(後續更新)