文章目录
  1. 1. springboot-activiti
    1. 1.1. 先来了解这些表
    2. 1.2. 以请假流程为例写一个demo
  2. 2. activiti5.x VS activiti6.x
  3. 3. springboot集成
    1. 3.1. 默认url访问鉴权
    2. 3.2. 忽略url访问鉴权
    3. 3.3. 配置数据源
    4. 3.4. JPA接口
    5. 3.5. mybatis集成
    6. 3.6. 查看审核流程表(png)
    7. 3.7. 获取流程图中文乱码问题

springboot-activiti

spring boot + web + mybatis + H2

工作流Activiti,在这里不作介绍了。
可以参考这几篇文章:

http://www.cnblogs.com/gcjava/archive/2017/04/19/6734793.html

http://blog.csdn.net/xnf1991/article/details/52610277

springboot集成

根据官方教程,先写一个demo

官方教程quick start

什么?文档写的太烂,很多英文写的不详细?那就看看5.x的中文手册

Activiti5.6中文手册

Activiti请假例子

我配置了一个mysql5.7.20,跑一个actiti引擎会初始化28张表。

分别是:

act_evt_log, 
act_ge_bytearray, 
act_ge_property, 
act_hi_actinst, 
act_hi_attachment, 
act_hi_comment, 
act_hi_detail, 
act_hi_identitylink, 
act_hi_procinst, 
act_hi_taskinst, 
act_hi_varinst, 
act_id_group, 
act_id_info,
act_id_membership, 
act_id_user, 
act_procdef_info, 
act_re_deployment, 
act_re_model, 
act_re_procdef, 
act_ru_deadletter_job, 
act_ru_event_subscr, 
act_ru_execution, 
act_ru_identitylink, 
act_ru_job, 
act_ru_suspended_job, 
act_ru_task, 
act_ru_timer_job, 
act_ru_variable

这么多表,看着一脸懵逼。

先来了解这些表

Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。用途也和服务的API对应。
1) ACT_RE_*: ‘RE’表示repository。 这个前缀的表包含了流程定义和流程静态资源(图片,规则,等等)。
2) ACT_RU_*: ‘RU’表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
3) ACT_ID_*: ‘ID’表示identity。 这些表包含身份信息,比如用户,组等等。
4) ACT_HI_*: ‘HI’表示history。 这些表包含历史数据,比如历史流程实例,变量,任务等等。
5) ACT_GE_*: 通用数据, 用于不同场景下。
资源库流程规则表
  1) act_re_deployment 部署信息表
  2) act_re_model 流程设计模型部署表
  3) act_re_procdef 流程定义数据表
运行时数据库表
  1) act_ru_execution 运行时流程执行实例表
  2) act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息
  3) act_ru_task 运行时任务节点表
  4) act_ru_variable 运行时流程变量数据表
  5) act_ru_timer_job ?
  6) act_ru_suspended_job ?
  7) act_ru_event_subscr ?
  8) act_ru_deadletter_job ?
  9) act_ru_job ?

历史数据库表
  1) act_hi_actinst 历史节点表
  2) act_hi_attachment 历史附件表
  3) act_hi_comment 历史意见表
  4) act_hi_identitylink 历史流程人员表
  5) act_hi_detail 历史详情表,提供历史变量的查询
  6) act_hi_procinst 历史流程实例表
  7) act_hi_taskinst 历史任务实例表
  8) act_hi_varinst 历史变量表
组织机构表
  1) act_id_group 用户组信息表
  2) act_id_info 用户扩展信息表
  3) act_id_membership 用户与用户组对应信息表
  4) act_id_user 用户信息表
  这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足
通用数据表
  1) act_ge_bytearray 二进制数据表
  2) act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录

act_procdef_info
act_evt_log

参考这张图:

图

以请假流程为例写一个demo

java\com\example\demo\VacationRequestTest.java

activiti5.x VS activiti6.x

想要快速入门,activiti5.x的explorer.war部署后可以看到数据库中的流程与变化

springboot集成

新建一个project,springboot-activiti

pom:

<?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.example</groupId>
    <artifactId>activiti-demo2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>springboot-activiti6</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <activiti.version>6.0.0</activiti.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter-basic</artifactId>
            <version>${activiti.version}</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter-rest-api</artifactId>
            <version>${activiti.version}</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter-actuator</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter-jpa</artifactId>
            <version>${activiti.version}</version>
        </dependency>

        <!-- Use MySQL Connector-J -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.44</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.30</version>
        </dependency>

        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

默认url访问鉴权

其中,activiti-spring-boot-starter-rest-api 默认对RestController的url会进行basic authentication(权限验证),调用post方式的rest地址时需要输入用户名密码,

而此用户名和密码需要在springboot的MyActivitiApp类中加上:

@Bean
InitializingBean usersAndGroupsInitializer(final IdentityService identityService) {

    return new InitializingBean() {
        public void afterPropertiesSet() throws Exception {

            Group group = identityService.newGroup("user");
            group.setName("users");
            group.setType("security-role");
            identityService.saveGroup(group);

            User admin = identityService.newUser("admin");
            admin.setPassword("admin");
            identityService.saveUser(admin);

        }
    };
}

其中,identityService.newGroup("user");
是在 act_id_group表中插入了一条用户组为user的数据,类型是security-role

User admin = identityService.newUser("admin");
admin.setPassword("admin");
identityService.saveUser(admin);`

是在 act_id_user 表中增加一条用户名和密码为admin的用户。

用curl访问时:

curl -u admin:admin -H "Content-Type: application/json" -d '{"userName" : "sam"}' http://localhost:8080/process

忽略url访问鉴权

在springboot的启动类的注解上加上如下:

@SpringBootApplication(exclude = {
        org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration.class,
        org.activiti.spring.boot.SecurityAutoConfiguration.class,
        org.springframework.boot.actuate.autoconfigure.ManagementWebSecurityAutoConfiguration.class
})
public class MyActivitiApp {
    .....
}

然后再访问时就不需要加用户和密码了,直接访问(post请求,不指定请求方式的情况下指全部):

curl -H "Content-Type: application/json" -d '{"userName" : "sam"}' http://localhost:8080/process

配置数据源

application.properties:

spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/activiti2?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = 123456

spring.jpa.hibernate.ddl-auto=update

activiti遵循springboot的配置。

JPA接口

repository需要继承父类JpaRepository,遵循接口泛形定义。

以本例子repository为例:

public interface PersonRepository extends JpaRepository<Person, Long> {

    Person findByUsername(String username);

}

默认是用hibernate实现的持久层。

但是公司项目都是mybatis,而activiti内部就是用ibatis实现的,那么应该对mybatis的支持更好。

mybatis集成

查看审核流程表(png)

一个流程发布后,activiti都会将bpmn文件和生成的png文件存在数据库中,就是act_ge_bytearray 这张表。

取的时候就这样:

@Test
public void getImageById()throws Exception{
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
InputStream inputStream= processEngine.getRepositoryService()
.getResourceAsStream(“27501”, “processes/VacationTest.VocationProcess.png”); // 根据流程部署ID和资源名称获取输入流
FileUtils.copyInputStreamToFile(inputStream, new File(“D:/helloWorld.png”));
}

获取流程图中文乱码问题

Spring Boot是微服务快速开发框架,强调的是零配置,显然不推荐采用XML配置文件的方式解决。不使用Spring Boot的时候,

是通过下面这种方式就可以解决:

  • ①原始解决方式:在Spring配置文件中的
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> 

中加入两行代码:

<property name="activityFontName" value="宋体"/>

<property name="labelFontName" value="宋体"/>

配置如下:

<bean id="processEngineConfiguration"
class="org.activiti.spring.SpringProcessEngineConfiguration">
<property name="activityFontName" value="宋体"/>
<property name="labelFontName" value="宋体"/>
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
<property name="databaseSchemaUpdate" value="true" />
<property name="mailServerHost" value="localhost" />
<property name="mailServerPort" value="5025" />
<property name="jpaHandleTransaction" value="true" />
<property name="jpaCloseEntityManager" value="true" />
<property name="jobExecutorActivate" value="false" />
</bean>
  • ②Spring Boot中我采用的解决办法是,生成流程图的时候设置字体和编码信息解决,如下

      @Test
          public void genPic() throws Exception {
              ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
              ProcessInstance pi = processEngine.getRuntimeService().createProcessInstanceQuery().deploymentId("27503").singleResult();
              BpmnModel bpmnModel = processEngine.getRepositoryService().getBpmnModel(pi.getProcessDefinitionId());
              List<String> activeIds = processEngine.getRuntimeService().getActiveActivityIds(pi.getId());
              ProcessDiagramGenerator p = new DefaultProcessDiagramGenerator();
              InputStream is = p.generateDiagram(bpmnModel, "png", activeIds, Collections.<String> emptyList(),"", "宋体", "宋体",null,
                       1.0);
    
              File file = new File("D:/process.png");
              OutputStream os = new FileOutputStream(file);
    
              byte[] buffer = new byte[1024];
              int len = 0;
              while ((len = is.read(buffer)) != -1) {
                  os.write(buffer, 0, len);
              }
    
              os.close();
              is.close();
    }
    

参考如下文章:

spring官方文档

activiti官方文档
参考

文章目录
  1. 1. springboot-activiti
    1. 1.1. 先来了解这些表
    2. 1.2. 以请假流程为例写一个demo
  2. 2. activiti5.x VS activiti6.x
  3. 3. springboot集成
    1. 3.1. 默认url访问鉴权
    2. 3.2. 忽略url访问鉴权
    3. 3.3. 配置数据源
    4. 3.4. JPA接口
    5. 3.5. mybatis集成
    6. 3.6. 查看审核流程表(png)
    7. 3.7. 获取流程图中文乱码问题