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中配置,须要进行特殊字符转义;
控制台结果:(后续更新)