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出来的对象,是动态的

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是基于Spring Boot和Activiti 5的请假工作流示例: 1. 首先,创建一个Spring Boot项目,并添加以下依赖: ```xml <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>5.22.0</version> </dependency> ``` 2. 在项目中创建一个Activiti配置类: ```java @Configuration public class ActivitiConfig { @Bean public ProcessEngineConfiguration processEngineConfiguration(DataSource dataSource, PlatformTransactionManager transactionManager) { SpringProcessEngineConfiguration processEngineConfiguration = new SpringProcessEngineConfiguration(); processEngineConfiguration.setDataSource(dataSource); processEngineConfiguration.setTransactionManager(transactionManager); processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); return processEngineConfiguration; } @Bean public ProcessEngineFactoryBean processEngineFactoryBean(ProcessEngineConfiguration processEngineConfiguration) { ProcessEngineFactoryBean processEngineFactoryBean = new ProcessEngineFactoryBean(); processEngineFactoryBean.setProcessEngineConfiguration(processEngineConfiguration); return processEngineFactoryBean; } @Bean public RepositoryService repositoryService(ProcessEngine processEngine) { return processEngine.getRepositoryService(); } @Bean public RuntimeService runtimeService(ProcessEngine processEngine) { return processEngine.getRuntimeService(); } @Bean public TaskService taskService(ProcessEngine processEngine) { return processEngine.getTaskService(); } @Bean public HistoryService historyService(ProcessEngine processEngine) { return processEngine.getHistoryService(); } @Bean public ManagementService managementService(ProcessEngine processEngine) { return processEngine.getManagementService(); } } ``` 3. 创建请假流程的BPMN文件: 请假流程BPMN文件示例: ```xml <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="http://www.activiti.org/test"> <process id="leaveProcess" name="请假流程" isExecutable="true"> <startEvent id="startEvent" name="开始"/> <userTask id="applyTask" name="请假申请" activiti:assignee="${applyUser}"> <extensionElements> <activiti:taskListener event="create" class="com.example.activiti.listener.ApplyTaskListener"/> </extensionElements> </userTask> <userTask id="auditTask" name="审批" activiti:assignee="${auditUser}"> <extensionElements> <activiti:taskListener event="create" class="com.example.activiti.listener.AuditTaskListener"/> </extensionElements> </userTask> <endEvent id="endEvent" name="结束"/> <sequenceFlow id="startToApply" sourceRef="startEvent" targetRef="applyTask"/> <sequenceFlow id="applyToAudit" sourceRef="applyTask" targetRef="auditTask"/> <sequenceFlow id="auditToEnd" sourceRef="auditTask" targetRef="endEvent"/> </process> </definitions> ``` 4. 创建请假申请和审批任务的TaskListener: ```java public class ApplyTaskListener implements TaskListener { @Override public void notify(DelegateTask delegateTask) { // 设置任务的候选人 delegateTask.addCandidateUser("user1"); delegateTask.addCandidateUser("user2"); } } public class AuditTaskListener implements TaskListener { @Override public void notify(DelegateTask delegateTask) { // 获取请假申请的信息 String leaveInfo = delegateTask.getVariable("leaveInfo").toString(); // TODO: 根据请假申请的信息进行审批 } } ``` 5. 创建一个请假申请的Controller: ```java @RestController @RequestMapping("/leave") public class LeaveController { @Autowired private RuntimeService runtimeService; @PostMapping("/apply") public String apply(@RequestBody LeaveRequest leaveRequest) { // 启动请假流程 Map<String, Object> variables = new HashMap<>(); variables.put("applyUser", "user"); variables.put("leaveInfo", leaveRequest.getInfo()); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveProcess", variables); return processInstance.getId(); } } ``` 6. 创建一个测试用例,模拟审批流程: ```java @RunWith(SpringRunner.class) @SpringBootTest public class LeaveProcessTest { @Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; @Test public void testLeaveProcess() { // 启动请假流程 Map<String, Object> variables = new HashMap<>(); variables.put("applyUser", "user"); variables.put("auditUser", "admin"); variables.put("leaveInfo", "请假三天"); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveProcess", variables); // 审批任务 Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult(); taskService.claim(task.getId(), "admin"); taskService.complete(task.getId()); } } ``` 以上就是基于Spring Boot和Activiti 5的请假工作流示例,希望能够帮助到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值