saas疯行的年代,工作流俨然是一种职业素质

saas疯行的年代,工作流俨然是一种职业素质

前言

  • 现在越来越多的项目开始使用工作流来满足日常的工作了。今天我们看看Activiti的工作流,我们先入门下BPMN绘画

环境安装

  • 关于流程的BPMN文件主要还是通过eclipse开发工具进行集成绘画的。idea中主要是actiBPM绘画的,但是2014年之后actiBPM就不在维护了,现在直接是无法在新的idea版本中安装使用了。
  • 既然如此你可以idea开发项目,通过eclipse绘制,但是这种情况好像很麻烦。这里推荐另外一个集成工具绘制BPMN流程图示
  • camunda-modeler就是一个第三方的流程设计工具。他的好处是替代了eclipse , 我们可以通过idea的External Tools方式加载进来。

saas疯行的年代,工作流俨然是一种职业素质

saas疯行的年代,工作流俨然是一种职业素质

  • 剩下的我们就可以绘制了。

saas疯行的年代,工作流俨然是一种职业素质

扩展

  • 关于类似camunda第三方流程绘制的软件,大多都会提供社区办。他们是以java服务的方式启动的。为什么还需要这种方式呢?因为靠着这种方式我们可以通过调用api的方式通过camunda来绘制流程。在我们的自己的流程平台中就可以绘制了。这样就将流程绘制器接入到我们自己的平台系统中了。

发布流程

  • 首先我们通过camunda进行绘制一个简易的流程。上面我们先通过tomcat形式启动一个camunda平台,将我们制作的流程发布上去。

saas疯行的年代,工作流俨然是一种职业素质

saas疯行的年代,工作流俨然是一种职业素质

服务任务

  • 首先我们的刷卡付款这个动作是服务端操作。这里我们点击后右侧设置栏中设置器服务方式

saas疯行的年代,工作流俨然是一种职业素质

  • 最终服务端是通过监听的方式来获取节点信息的,所以这里我们需要设置下消息类型(Topic)。

saas疯行的年代,工作流俨然是一种职业素质

网关

  • 现在我们的流程还是很简单的。上面我们通过设置Implementation的方式为External表示该节点借助外部服务来共同实现且指定消息主题topic 。 关于消息的监听我们下方通过Java方式来监控信息。在流程中还有一个重要角色就是网关 。 这里的网关就是我们的判断节点。比如我们上面刷卡付款请求存在这么一种需求
  • 付款金额大于等于1000元时需要进行付款审批。小于1000元则可以直接进行付款。
  • 在camunda中有个×的图形,就是我们所说的网关。我们稍微修改下流程图

saas疯行的年代,工作流俨然是一种职业素质

  • 网关我们直接拖拽进来就可以了,他的特色就是存在两条或者更多条分支。那么最终会走哪一个分支就需要我们在每个分支上设置条件了。这里我们通过Java的表达式设置条件。

saas疯行的年代,工作流俨然是一种职业素质

  • amount这就是一个变量。这个变量你可以随意定义,但是在流程开始的时候必须提供这个变量,否则会报错

saas疯行的年代,工作流俨然是一种职业素质

  • 我们可以在网关开始前,先让用户提供先流程的必要信息

saas疯行的年代,工作流俨然是一种职业素质

  • 然后才会根据填写的金额进行扭转流程。付款审批需要根据流程信息进行审批,所以在填写申请单上我还加了item这个参数。为什么加上这个参数呢?假如我是批准付款的负责人。但是我不是很关心金额的事情,或者说我对某些项目就是无脑的通过。这个时候我们可以借助流程的自动化决策来实现该节点的自动审批。
  • 这里我们引入流程的DMN,我们通过camunda新建一个DMN文件。并设置dmn的id

saas疯行的年代,工作流俨然是一种职业素质

  • 然后点击左上角的图标进行设置规则

saas疯行的年代,工作流俨然是一种职业素质

  • 我们的规则很简单,凡是item-xyz项目的我都会审批通过,否则一律不通过。

  • 在这个规则中我们可以设置很多中方式,上面我们的是唯一方式,也就是说每种条件是互斥的,非黑即白的。还有其它的方式我们可以自己调试下

  • 在回到我们主流程中,我们选择Implementation方式为DMN , 并且ref选择上面我们设置的DMN的id

saas疯行的年代,工作流俨然是一种职业素质

Java监控流程信息

<dependency>
    <groupId>org.camunda.bpm</groupId>
    <artifactId>camunda-external-task-client</artifactId>
    <version>7.15.0</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.6.1</version>
</dependency>
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
复制代码
  • 我们这里添加依赖后,开始监听我们流程的topic对应流程里的外部服务
ExternalTaskClient client = ExternalTaskClient.create()
        .baseUrl("http://localhost:8080/engine-rest")
        .asyncResponseTimeout(10000) // 长轮询超时时间
        .build();

// 订阅指定的外部任务
client.subscribe("charge-card")
        .lockDuration(1000) // 默认锁定时间为20秒,这里修改为1秒
        .handler((externalTask, externalTaskService) -> {
            // 将您的业务逻辑写在这

            // 获取流程变量
            String item = (String) externalTask.getVariable("item");
            Long amount = (Long) externalTask.getVariable("amount");

            LOGGER.info("Charging credit card with an amount of '" + amount + "'€ for the item '" + item + "'...");

            try {
                Desktop.getDesktop().browse(new URI("https://docs.camunda.org/get-started/quick-start/complete"));
            } catch (Exception e) {
                e.printStackTrace();
            }

            // 完成任务
            externalTaskService.complete(externalTask);
        })
        .open();
复制代码
  • 此时我们可以查看下日志,

saas疯行的年代,工作流俨然是一种职业素质

Maltcloud集成

  • 工作流在maltcloud版本计划中是排在二期进行的,所以我是在maltcloud完成了基本的功能之后开发计划开发工作流的相关操作。首先就是流程的绘制,上面已经提到了流程的基本绘制及发布。下面我们看看如何将工作流继承到我们的企业级框架maltcloud中吧。
  • 注意在整合的时候需要springboot和camunda版本匹配。官网给我们提供了响应版本的匹配方案

saas疯行的年代,工作流俨然是一种职业素质

  • 这里解释一下
    • 第一列【springboot starter version】表示camunda的springboot starter版本。
    • 第二列【camunda platform version】表示实际的camunda版本
    • 第三列【springboot version】表示我们系统的springboot版本。
  • 结合maltcloud使用的是2.2.2.RELEASE版本,我们可以定位到使用camunda springboot starter版本应该是3.4.x; 然后我们在去maven仓库中查看下相关的版本

saas疯行的年代,工作流俨然是一种职业素质

  • 这里我一开始选择使用3.4.0的版本。后来发现2.2.x.RELEASE的springboot也支持7.13.x , 最终决定使用7.13.0这个版本。

saas疯行的年代,工作流俨然是一种职业素质

  • 因为camunda-bpm-spring-starter中使用的mybatis使用的是3.5.3但是maltcloud中使用的是3.5.6版本。所以我这里还需要解决下冲突。最终pom配置如下
<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <camunda.spring-boot.version>7.13.0</camunda.spring-boot.version>
</properties>
<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>com.github.zxhtom</groupId>
        <artifactId>org.components.datasource</artifactId>
        <version>${project.version}</version>
        <exclusions>
            <exclusion>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.camunda.bpm.springboot</groupId>
        <artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId>
        <version>${camunda.spring-boot.version}</version>
    </dependency>
    <dependency>
        <groupId>org.camunda.bpm.springboot</groupId>
        <artifactId>camunda-bpm-spring-boot-starter-rest</artifactId>
        <version>${camunda.spring-boot.version}</version>
    </dependency>
    <dependency>
        <groupId>org.camunda.bpm.springboot</groupId>
        <artifactId>camunda-bpm-spring-boot-starter</artifactId>
        <version>${camunda.spring-boot.version}</version>
        <exclusions>
            <exclusion>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

</dependencies>
复制代码
  • maltcloud是笔者设计的一个企业级开发框架,暂时还在开发阶段,待合适的时期开源。这里我引入了maltcloud平台中的datasource模块。这个模块主要就是引入mybatis的配置。读者可以把这段去掉自行配置mybatis就可以了。

细节补充

相关版本文档

saas疯行的年代,工作流俨然是一种职业素质

  • 通过options选择版本。在Installation Procedure中就可以下载指定的版本了。点进去之后会有小版本列表。因为我们maltcloud中选择的是7.13.0 。 所以我们下载对应的平台camunda.

saas疯行的年代,工作流俨然是一种职业素质

上一篇:saas疯行的年代,工作流俨然是一种职业素质


下一篇:企业级SaaS架构实战(2):架构视图与视角