likes
comments
collection
share

一文解读flowable工作流

作者站长头像
站长
· 阅读数 25

flowable工作流的定义流程

🌜1. flowable

☁️ 1.1 定义

  Flowable是一个开源的业务流程管理(BPM)平台,它可以帮助开发人员和业务专家快速构建、部署和管理复杂的业务流程。Flowable提供了一个可视化的工作流设计器,可以方便地定义工作流程、任务、网关、决策等元素,并支持多种流程引擎的选择,如Activiti、Camunda等。

Flowable的核心特性包括:

  1. 可视化工作流设计器:Flowable提供了一个直观、易用的工作流设计器,可以方便地定义工作流程、任务、网关、决策等元素。
  2. 多引擎支持:Flowable支持多种流程引擎的选择,如Activiti、Camunda等,可以根据应用程序的需求进行选择。
  3. 扩展性:Flowable提供了丰富的API和插件,可以方便地进行定制和扩展。
  4. 集成性:Flowable可以与Spring、Hibernate等常见的Java框架集成,从而实现更好的互操作性和可维护性。

☁️ 1.2 作用

  Flowable可以十分灵活地加入你的应用/服务/构架。可以将JAR形式发布的Flowable库加入应用或服务,来嵌入引擎。

  以JAR形式发布使Flowable可以轻易加入任何Java环境:Java SE;Tomcat、Jetty或Spring之类的servlet容器;JBoss或WebSphere之类的Java EE服务器,等等。

  另外,也可以使用Flowable REST API进行HTTP调用。

  也有许多Flowable应用(Flowable Modeler, Flowable Admin, Flowable IDM 与 Flowable Task),提供了直接可用的UI示例,可以使用流程与任务。

  所有使用Flowable方法的共同点是核心引擎。核心引擎是一组服务的集合,并提供管理与执行业务流程的API。

☁️ 1.3 流程

Flowable的流程通常由以下几个步骤组成:

  1. 定义工作流:使用Flowable的工作流设计器定义工作流,包括流程定义、任务、网关、决策等元素。
  2. 配置流程引擎:选择合适的流程引擎,如Activiti、Camunda等,并进行相应的配置和集成。
  3. 创建流程实例:根据工作流定义创建一个新的流程实例,并将任务分配给相应的人员或组。
  4. 执行流程:流程实例启动后,会按照预定义的流程进行执行,包括任务完成、网关判断、决策结果等。
  5. 监控流程:可以使用Flowable提供的监控工具对流程进行实时监控和管理,包括查看流程状态、任务完成情况、性能指标等。

  总之,Flowable的流程通常由工作流定义、流程引擎配置、流程实例创建和执行、流程监控等多个步骤组成,可以帮助快速构建、部署和管理复杂的业务流程。


🔥 2. 使用实例

😈 2.1 引入pom依赖

  Flowable引擎在运行流程实例时,需要使用数据库来存储执行与历史数据,所以需要添加对应的数据库驱动依赖。 Flowable使用SLF4J作为内部日志框架。

		<!--flowable 流程引擎-->
		<!-- https://mvnrepository.com/artifact/org.flowable/flowable-spring-boot-starter-process --> 
		
		<dependency>
			<groupId>org.flowable</groupId>
			<artifactId>flowable-spring-boot-starter-process</artifactId>
			<version>6.4.1</version>
		</dependency>
		<dependency>
			<groupId>org.flowable</groupId>
			<artifactId>flowable-ui-modeler-rest</artifactId>
			<version>6.4.1</version>
		</dependency>
		
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</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>

Log4j需要一个配置文件。在src/main/resources文件夹下添加log4j.properties文件,并写入下列内容:

log4j.rootLogger=DEBUG, CA

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

😈 2.2 yml文件

数据库自行创建 一个简单的yml配置:


#flowable
flowable:
  common:
    app:
      idm-url: http://127.0.0.1:9602/flowable-idm
      async-executor-activate: false

🚎 2.3 审批流程xml

一个简单的审批流程的demo: 将下面的XML保存在src/main/resources文件夹下

<?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:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef">
  
</definitions>

🔎 2.4 引擎配置类

/**
 * 流程引擎配置类
 */
@Configuration
public class ScnProccessEngine {

    private static final Logger LOGGER = LoggerFactory.getLogger(ScnProccessEngine.class);

    @Autowired
    private DataSource dataSource;

    @Autowired
    protected ResourceLoader resourceLoader;

    protected static Properties databaseTypeMappings = getDefaultDatabaseTypeMappings();

    public static Properties getDefaultDatabaseTypeMappings() {
        Properties databaseTypeMappings = new Properties();
      
        return databaseTypeMappings;
    }

    @Bean
    public SpringProcessEngineConfiguration springProcessEngineConfiguration() {
        SpringProcessEngineConfiguration springProcessEngineConfiguration = new SpringProcessEngineConfiguration();
        springProcessEngineConfiguration.setDataSource(dataSource);
        springProcessEngineConfiguration.setDatabaseSchemaUpdate("true");
        springProcessEngineConfiguration.setTransactionManager(dataSourceTransactionManager(dataSource));
        return springProcessEngineConfiguration;
    }

    /**
     * 事务管理器
     * @param dataSource
     * @return
     */
    @Bean
    public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSource);
        return dataSourceTransactionManager;
    }

    @Bean
    public FlowableModelerAppProperties flowableModelerAppProperties() {
        FlowableModelerAppProperties flowableModelerAppProperties = new FlowableModelerAppProperties();
        return flowableModelerAppProperties;
    }

    /**
     * sqlSessionTemplate的Bean
     * @param sqlSessionFactory
     * @return
     */
    @Bean(destroyMethod = "clearCache") // destroyMethod: see https://github.com/mybatis/old-google-code-issues/issues/778
    public SqlSessionTemplate SqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    private void closeDatabase(Liquibase liquibase) {
        if (liquibase != null) {
            Database database = liquibase.getDatabase();
            if (database != null) {
                try {
                    database.close();
                } catch (DatabaseException e) {
                    LOGGER.warn("Error closing database", e);
                }
            }
        }
    }

}

📢 2.5 公共接口controller

/**
 * Flowable 公共接口
 */
@RestController
@RequestMapping("/testDemo")
public class PubProccessController {

    /**
     * 根据用户身份信息查询用户代办任务
     * @param userIdentityPo
     * @return
     */
    @RequestMapping("/queryUserTask")
    public AjaxJson selectUserTaskByUserIdenty(@RequestBody UserIdentityPo userIdentityPo) throws GlobalException {
        return ajaxJson;
    }

    /**
     * 用户认领任务
     * @param flowTaskPo
     * @return
     * @throws GlobalException
     */
    @RequestMapping("/claimTask")
    public AjaxJson claimTask(@RequestBody FlowTaskPo flowTaskPo) throws GlobalException {
        AjaxJson ajaxJson = new AjaxJson();
        return ajaxJson;
    }

    /**
     * 查看流程图_高亮
     * @param httpServletResponse
     * @param flowTaskPo
     * @throws GlobalException
     */
    @RequestMapping("/genProcessDiagram")
    public AjaxJson genProcessDiagram(HttpServletResponse httpServletResponse, @RequestBody FlowTaskPo flowTaskPo) throws GlobalException {
        AjaxJson ajaxJson = new AjaxJson();

        return ajaxJson;
    }

}

上文写了一些公共的审批查看流程图等常用的方法。


🍂3. 支持的数据库

flowable支持的数据看有很多种 以下是官方给的支持的数据库的类型:

一文解读flowable工作流 flowable的默认的数据库是h2 所以使用的时候需要对h2数据库有个简单的了解。

  H2数据库是一个开源的Java数据库管理系统,它可以与各种关系型数据库进行集成,如MySQL、Oracle、PostgreSQL等。H2数据库是基于Java语言编写的,可以在Java应用程序中嵌入使用,也可以作为一个独立的数据库服务器运行。

H2数据库的特点包括:

  1. 轻量级:H2数据库非常轻量级,可以在内存中运行,不需要安装和配置外部数据库服务器。
  2. 快速:H2数据库支持高性能的JDBC驱动程序,可以实现快速的数据访问和查询。
  3. 开源免费:H2数据库是开源软件,可以免费使用和修改。
  4. 支持嵌入式:H2数据库可以嵌入到Java应用程序中使用,方便开发人员在应用程序中使用本地数据库。

  H2数据库是一个轻量级、高性能、开源免费的Java数据库管理系统,适合用于开发嵌入式应用程序或小型项目中的数据存储和管理。


🚩 总结:

flowable 注意事项:

  flowable会为我们自动创建表,用于数据,历史记录,流程定义,运行实例等等。 如果启动失败,解决错误以后,每次都需要把表数据清空,或者删除之后再重新启动。

flowable demo源码:flowable demo


如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏 🙌一起讨论 你的评价就是我✍️创作的动力! 💞💞💞