03 编写第一个Activiti程序

本文以Intellij为例,将自己创建一个与上节相同的请假流程。观看本文,需细思与上一节的联系。

目录

1. 安装Intellij的Plugin actiBPM以支持图形化绘制流程图

2. 新建Maven项目

2.1 pom.xml

2.2 bpmn流程图绘制

2.3 自动生成Activiti所需table

3. 部署流程定义Deployment

3.1 代码部分

3.2 自动将bpmn文件以blob二进制形式保存于ACT_GE_BYTEARRAY

4. 启动流程实例ProcessInstance

4.1 java code

4.2 执行结果

4.3 分析

5. 流程定义、流程实例与任务的关系


1. 安装Intellij的Plugin actiBPM以支持图形化绘制流程图

2. 新建Maven项目

2.1 pom.xml

<?xml version="1.0" encoding="UTF-8"?>

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.study</groupId>
  <artifactId>first-act</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>activiti</name>
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <activiti.version>6.0.0</activiti.version>
    <mysql.version>8.0.16</mysql.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.activiti</groupId>
      <artifactId>activiti-engine</artifactId>
      <version>6.0.0</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.21</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.21</version>
    </dependency>
    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
      <version>1.4.193</version>
    </dependency>
    <!-- mysql驱动 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>${mysql.version}</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- Maven Assembly Plugin -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>2.4.1</version>
          <configuration>
            <!-- get all project dependencies -->
            <descriptorRefs>
              <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <!-- MainClass in mainfest make a executable jar -->
            <archive>
              <manifest>
                <mainClass>com.study.App</mainClass>
              </manifest>
            </archive>
          </configuration>
          <executions>
            <execution>
              <id>make-assembly</id>
              <!-- bind to the packaging phase -->
              <phase>package</phase>
              <goals>
                <goal>single</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

其中maven-assembly-plugin的引入是为了在package周期时额外生成一个fat jar(包含了所有依赖的可独立运行jar)

2.2 bpmn流程图绘制

2.2.1 新建bpmn文件

2.2.2 拖拽元素绘制图形

2.2.3 修改Id为leave

2.3 自动生成Activiti所需table

2.3.1 配置activiti.cfg.xml文件

获取一个ProcessEngine对象最容易的方式是使用org.activiti.engine.ProcessEngines class

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine()

这个方法会自动寻找在classpath路径下名为activiti.cfg.xml文件。之后基于这个文件构建流程引擎。
基于H2内存数据库的官方示例

<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="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" />
    <property name="jdbcDriver" value="org.h2.Driver" />
    <property name="jdbcUsername" value="sa" />
    <property name="jdbcPassword" value="" />

    <property name="databaseSchemaUpdate" value="true" />

    <property name="asyncExecutorActivate" value="false" />

    <property name="mailServerHost" value="mail.my-corp.com" />
    <property name="mailServerPort" value="5025" />
  </bean>

</beans>
H2数据库其实是可以保存在本地磁盘持久化的,欲知详情,自行百度
当然,你可以采用mysql数据库
<?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 -->
	<bean id="processEngineConfiguration"
		class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
		<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/ACT?characterEncoding=utf-8" />
		<property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver" />
		<property name="jdbcUsername" value="kevin" />
		<property name="jdbcPassword" value="12345678" />
		<property name="databaseSchemaUpdate" value="true" />
	</bean>
</beans>

2.3.2 执行java生成table

package com.study;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;

public class App 
{
    public static void main( String[] args )
    {
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        engine.close();
    }
}

2.3.3 生成的28张table

 

3. 部署流程定义Deployment

3.1 代码部分

package com.study;

import org.activiti.engine.*;

public class App 
{
    public static void main( String[] args )
    {
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService rs = engine.getRepositoryService();
        Deployment deployment = rs.createDeployment().addClasspathResource("first.bpmn").deploy();
        engine.close();
    }
}

3.2 自动将bpmn文件以blob二进制形式保存于ACT_GE_BYTEARRAY

4. 启动流程实例ProcessInstance

4.1 java code

package com.study;

import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class App 
{
    private static final Logger LOGGER = LoggerFactory.getLogger(App.class);

    public static void main( String[] args )
    {
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService rs = engine.getRepositoryService();
        Deployment deployment = rs.createDeployment().addClasspathResource("first.bpmn").deploy();
        RuntimeService runtimeService = engine.getRuntimeService();
        ProcessInstance pi = runtimeService.startProcessInstanceByKey("leave");
        TaskService taskService = engine.getTaskService();
        // worker完成请假任务
        Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
        LOGGER.info("当前流程节点:{}",task.getId());
        taskService.complete(task.getId());
        //boss审核完成
        task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
        LOGGER.info("当前流程节点:{}",task.getId());
        taskService.complete(task.getId());

        task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
        LOGGER.info("当前流程节点:{}",task);
        engine.close();
    }
}

4.2 执行结果

10:12:25,903 [main] INFO  org.activiti.engine.compatibility.DefaultActiviti5CompatibilityHandlerFactory  - Activiti 5 compatibility handler implementation not found or error during instantiation : org.activiti.compatibility.DefaultActiviti5CompatibilityHandler. Activiti 5 backwards compatibility disabled.
10:12:25,955 [main] INFO  org.activiti.engine.impl.ProcessEngineImpl  - ProcessEngine default created
10:12:25,962 [main] INFO  org.activiti.engine.ProcessEngines  - initialised process engine default
10:12:27,668 [main] INFO  com.study.App  - 当前流程节点:5009
10:12:27,721 [main] INFO  com.study.App  - 当前流程节点:5011
10:12:27,801 [main] INFO  com.study.App  - 当前流程节点:null

4.3 分析

当执行结束后,流程实例便不再处于运行中的状态。此时流程实例中的所有task都已经结束了,所以最后是查询不到task对象的

 

5. 流程定义、流程实例与任务的关系

流程定义类似于Class,静态的

流程实例类似于Class new出来的对象,是动态的

任务是流程实例的组成部分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值