一、运行软件
开发软件:Spring Tool Suite 3.7.0.RELEASE
数据库:MySQL 5.7
JDK:JDK1.7
二、创建一个Activiti项目
如上:在pom 文件新增依赖的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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.activiti.examples</groupId> <artifactId>activiti-examples</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>BPMN 2.0 with Activiti - Examples</name> <!-- 项目属性 --> <properties> <jdk.version>1.7</jdk.version> <spring.version>4.1.5.RELEASE</spring.version> <hibernate.version>4.2.5.Final</hibernate.version> <spring-data-jpa.version>1.9.1.RELEASE</spring-data-jpa.version> <commons-dbcp.version>1.4</commons-dbcp.version> <jackson.version>2.0.4</jackson.version> <spymemcached.version>2.8.1</spymemcached.version> <guava.version>17.0</guava.version> <commons-lang3.version>3.3.2</commons-lang3.version> <commons-io.version>2.4</commons-io.version> <joda-time.version>2.1</joda-time.version> <slf4j.version>1.7.5</slf4j.version> <log4j.version>1.2.17</log4j.version> <jetty.version>8.1.15.v20140411</jetty.version> <h2.version>1.4.180</h2.version> <junit.version>4.10</junit.version> <mockito.version>1.9.0</mockito.version> <powermock.version>1.4.12</powermock.version> <activiti.version>5.22.0</activiti.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <!-- 依赖项定义 --> <dependencies> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.27</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.4</version> </dependency> <!-- activiti --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-json-converter</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-explorer</artifactId> <version>${activiti.version}</version> <exclusions> <exclusion> <artifactId>vaadin</artifactId> <groupId>com.vaadin</groupId> </exclusion> <exclusion> <artifactId>dcharts-widget</artifactId> <groupId>org.vaadin.addons</groupId> </exclusion> <exclusion> <artifactId>activiti-simple-workflow</artifactId> <groupId>org.activiti</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-modeler</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-rest</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-diagram-rest</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-cxf</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>juli</artifactId> <version>6.0.47</version> </dependency> <!-- cxf的http支持 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-api</artifactId> <version>2.7.6</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>2.7.6</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <version>2.7.6</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>2.7.6</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.2.11</version> </dependency> <!-- 支持activiti缓存 --> <dependency> <groupId>org.infinispan</groupId> <artifactId>infinispan-core</artifactId> <version>5.1.7.Final</version> </dependency> <!-- UTILS --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>${commons-io.version}</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2.2</version> </dependency> <!-- SPRING begin --> <!-- spring basic --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.6.9</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.6.9</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency> <dependency> <groupId>asm</groupId> <artifactId>asm</artifactId> <version>3.3.1</version> </dependency> <!-- SPRING end --> <!-- PERSISTENCE begin --> <!-- hibernate --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> <version>1.0.1.Final</version> </dependency> <!-- spring data access --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>${spring-data-jpa.version}</version> <exclusions> <exclusion> <groupId>junit</groupId> <artifactId>junit-dep</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <!-- dbcp connection pool --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.0.1</version> </dependency> <!-- jdbc driver --> <dependency> <groupId>${jdbc.driver.groupId}</groupId> <artifactId>${jdbc.driver.artifactId}</artifactId> <version>${jdbc.driver.version}</version> <scope>runtime</scope> </dependency> <!-- PERSISTENCE end --> <!-- WEB begin --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- WEB end --> <!-- LOGGING begin --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <!-- LOGGING end --> <!-- GENERAL UTILS begin --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>${commons-lang3.version}</version> </dependency> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.8.3</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>${guava.version}</version> </dependency> <dependency> <groupId>org.jodd</groupId> <artifactId>jodd</artifactId> <version>3.3.2</version> </dependency> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>${joda-time.version}</version> </dependency> <!-- UUID --> <dependency> <groupId>com.fasterxml.uuid</groupId> <artifactId>java-uuid-generator</artifactId> <version>3.1.3</version> </dependency> <!-- GENERAL UTILS end --> <!-- TEST begin --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>${mockito.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>${powermock.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito</artifactId> <version>${powermock.version}</version> <scope>test</scope> <exclusions> <exclusion> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>${h2.version}</version> </dependency> <dependency> <groupId>org.dbunit</groupId> <artifactId>dbunit</artifactId> <version>2.4.8</version> </dependency> <!-- jetty --> <dependency> <groupId>org.eclipse.jetty.aggregate</groupId> <artifactId>jetty-webapp</artifactId> <version>${jetty.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-jsp</artifactId> <version>${jetty.version}</version> <scope>test</scope> </dependency> <!-- TEST end --> </dependencies> <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <plugins> <!-- compiler插件, 设定JDK版本 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>${jdk.version}</source> <target>${jdk.version}</target> <showWarnings>true</showWarnings> </configuration> </plugin> <!-- eclipse插件, 设定wtp版本并添加springIDE nature --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-eclipse-plugin</artifactId> <version>2.9</version> <configuration> <wtpversion>2.0</wtpversion> <additionalProjectnatures> <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature> </additionalProjectnatures> </configuration> </plugin> <!-- jetty插件, 设定context path与spring profile --> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>${jetty.version}</version> <configuration> <webApp> <contextPath>/${project.artifactId}</contextPath> </webApp> <stopKey>kad</stopKey> <stopPort>9999</stopPort> </configuration> </plugin> <!-- resource插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> <configuration> <nonFilteredFileExtensions> <!-- 过滤流程定义资源文件 --> <nonFilteredFileExtension>zip</nonFilteredFileExtension> <nonFilteredFileExtension>bar</nonFilteredFileExtension> <nonFilteredFileExtension>png</nonFilteredFileExtension> <nonFilteredFileExtension>bpmn</nonFilteredFileExtension> </nonFilteredFileExtensions> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> <!-- tomcat7 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <path>/${project.artifactId}</path> <systemProperties> <JAVA_OPTS>-Xms1024m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=1024m -Dfile.encoding=UTF-8</JAVA_OPTS> </systemProperties> </configuration> </plugin> </plugins> <finalName>kft-activiti-demo</finalName> </build> <profiles> <!-- h2 --> <profile> <id>h2</id> <properties> <db.type>h2</db.type> <!-- driver --> <jdbc.driver.groupId>com.h2database</jdbc.driver.groupId> <jdbc.driver.artifactId>h2</jdbc.driver.artifactId> <jdbc.driver.version>1.4.190</jdbc.driver.version> <!-- driver configs --> <jdbc.driver>org.h2.Driver</jdbc.driver> <jdbc.url>jdbc:h2:file:~/kft-activiti-demo;AUTO_SERVER=TRUE</jdbc.url> <jdbc.username>sa</jdbc.username> <jdbc.password></jdbc.password> <hibernate.dialect>org.hibernate.dialect.H2Dialect</hibernate.dialect> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build> </profile> <!-- mysql --> <profile> <id>mysql</id> <properties> <db.type>mysql</db.type> <!-- driver --> <jdbc.driver.groupId>mysql</jdbc.driver.groupId> <jdbc.driver.artifactId>mysql-connector-java</jdbc.driver.artifactId> <jdbc.driver.version>5.1.11</jdbc.driver.version> <!-- driver configs --> <jdbc.driver>com.mysql.jdbc.Driver</jdbc.driver> <jdbc.url><![CDATA[jdbc:mysql://localhost:3306/kad?useUnicode=true&characterEncoding=utf-8]]></jdbc.url> <jdbc.username>root</jdbc.username> <jdbc.password>root</jdbc.password> <hibernate.dialect>org.hibernate.dialect.MySQL5InnoDBDialect</hibernate.dialect> </properties> <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build> </profile> </profiles> </project>
新增完POM文件之后,项目上右击--->Configure--->Convert to Maven Project,然后maven --->update即可
新增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="jdbcDriver" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/kad?useUnicode=true&characterEncoding=utf-8"></property> <property name="jdbcUsername" value="root"></property> <property name="jdbcPassword" value="root"></property> <!-- 注入数据源信息 --> <property name="databaseSchemaUpdate" value="true"></property> </bean> <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean"> <!-- 注入自动建表设置 --> <property name="processEngineConfiguration" ref="processEngineConfiguration"></property> </bean> </beans>
新增log4j.properties 文件
# Output pattern : date [thread] priority category - message log4j.rootLogger=DEBUG, Console #Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=[${project.artifactId}] %d %p [%t] %C.%M(%L) | %m%n #Project defalult level log4j.logger.me.kafeitu.demo=DEBUG #spring default level log4j.logger.org.springframework=INFO #hibernate default level log4j.logger.org.hibernate=ERROR #apache log4j.logger.org.apache=ERROR log4j.logger.net.sf.ehcache=ERROR
项目结构如下图
新建bpmn文件
在diagrams上右击--new-other--Activiti Diagram---hello.bpmn
为了使bpmn文件保存之后即可生成一个新的PNG文件,需要在windows ---preferences---Activiti---Save Actions--勾选Create Process definition image when saving the diagram 选项
画流程图(先打开Properties窗口:windows--show view--properties)
点击相应的节点,填写Properties 信息
在流程图空白处点击
对bpmn 文件Ctrl+C之后即可看到bpmn文件被保存为png图片了
编写测试方法HelloWorld.java
package com.joydo; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.DeploymentBuilder; import org.junit.Test; public class HelloWorld { //获取流程引擎对象 //getDefaultProcessEngine方法内部会自动读取名为activiti.cfg.xml文件的配置信息 ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine(); /**部署流程定义*/ @Test public void deploymentProcessDefinition(){ //与流程定义和部署对象相关的Service RepositoryService repositoryService=processEngine.getRepositoryService(); DeploymentBuilder deploymentBuilder=repositoryService.createDeployment();//创建一个部署对象 deploymentBuilder.name("helloWorld入门程序");//添加部署的名称 deploymentBuilder.addClasspathResource("diagrams/hello.bpmn");//从classpath的资源加载,一次只能加载一个文件 deploymentBuilder.addClasspathResource("diagrams/hello.png");//从classpath的资源加载,一次只能加载一个文件 Deployment deployment=deploymentBuilder.deploy();//完成部署 //打印我们的流程信息 System.out.println("流程Id:"+deployment.getId()); System.out.println("流程Name:"+deployment.getName()); } }
新建数据库kad,具体的数据库配置看上面的activiti.cfg.xml文件
然后运行HelloWorldTest 项目,在项目启动之后数据库新增了26张数据表,分别是
具体每张表的含义看另外一篇博客(activiti数据库表结构剖析);
运行HelloWorld.java 文件,控制台打印
当然研究控制台的日志,我们发现流程启动的时候往三张表插入了数据
至于为什么Activiti 启动的时候会自动创建26张数据表,这个我们会在下一篇博客中详细介绍